OpenGL中ZFighting、颜色混合

接上篇 OpenGL深度测试 已经明白处理前后重叠造成缺口问题的解决方案是使用深度测试 glEnable(GL_DEPTH_TEST),这样渲染器就能识别哪面是正面哪面是背面从而进行正常的渲染;那么在使用深度测试的过程中会不会出现一些意外清空呢?

深度测试的潜在风险之 Z-fighting(Z冲突、Z闪烁)问题

因为在开启深度测试后,OpenGL就不会在绘制被遮挡的部分。这样的实现更加符合真实场景,但是由于深度缓存区精度的限制,对于深度相差非常小的情况下(例如在同一平面上进行2次绘制),OpenGL就可能出现不能正确判断两者的深度值,会导致深度测试的结果不可预测,显示出来的现象是交错闪烁的两个画面

Z闪烁

如何解决Z-fighting的问题

既然是因为靠的太近无法区分,那么就可以在2个图层之间加入一个微妙的间隔。OpenGL提供了一个解决方案“多边形偏移”

启用多边形偏移 Polygon Offset

glEnable(GL_POLYGON_OFFSET_FILL); //启用多边形偏移 POLYGON Offset

glDisable(GL_POLYGON_OFFSET_FILL); //关闭多边形偏移 POLYGON Offset

参数:

GL_POLYGON_OFFSET_FILL    //对应模式:GL_FILL

GL_POLYGON_OFFSET_LINE    //对应模式:GL_LINE

GL_POLYGON_OFFSET_POINT    //对应模式:GL_POINT


指定偏移量

glPolygonOffset (GLfloat factor, GLfloat units); 

每个Fragment的深度值都会增加Offset = (m*factor) + (r*units) 这样的偏移量;一个大于0的Offset会把模型推到离摄像机更远的位置,相反一个小于0的Offset会把模型拉近

这两个参数一般填 -1 和 -1,就可基本满足要求

如何预防ZFighting闪烁问题

1.不要将两个物体靠的太近,避免渲染时三角形叠加在一起(对场景中的物体插入一个少量的偏移)

2.尽可能将近裁剪面设置的离观察者远一些

3.使用更高位数的深度缓存区(比如:32位、64位)


颜色混合

OpenGL渲染时会把颜色值存储在颜色缓存区,每个片段的深度值也放在深度缓存区。

深度缓存区关闭时:新颜色将无脑覆盖原来颜色缓存区的值

深度缓存区打开时:只有当新的颜色片段比原来的值更靠近裁剪平面才会体会原来的颜色片段

在开启深度测试后,2个重叠图层中,其中有一个图层时半透明的,有一个图层时非半透明的;那么此时就不在是简单的比较深度值,然后进行替换,而是要将2个图层颜色进行混合

颜色混合:

1、目标颜色:指已经存储在颜色缓存区的颜色值

2、源颜色:作为当前渲染命令结果进入颜色缓存区的颜色值

使用方式(2种):

开关方式(颜色混合)---单纯的2个图层重叠进行混合

这种混合并不能解决颜色的混合。在固定着色器和可编程着色器都可以使用这种方式

混合方程式---处理图片原图颜色+薄薄的绿色(需要颜色混合方程式的计算)

用于处理类似滤镜效果的场景,简单描述就是将需要处理的图片颜色和图片上覆盖的半透明颜色进行混合 即 两股颜色混合,需要借助混合方程式,来实现两股颜色的混合。一般是在可编程着色器中片元着色器中使用

混合方程式:

Cf = (Cs * S) + (Cd * D),此方程式不需要关注,一般使用默认即可

Cf -- 最终组合的颜色值

Cd:源颜色 -- 当前渲染命令传入的颜色值

Cs:目标颜色 -- 颜色缓冲区中已经存在的颜色值

S:源混合因子

D:目标混合因子 在混合方程中

例如:

目标颜色(红色):(1.0f,0.0f,0.0f,1.0f),如果在上面覆盖一种alpha为0.6的蓝色(0.0f,0.0f,1.0f,0.6f),那么Cd = (1.0f,0.0f,0.0f,1.0f), Cs=(0.0f,0.0f,1.0f,0.6f),

S= 源颜色的alpha值= 0.6, D = 1-源颜色的alpha值 = 0.4

新颜色的alpha值越高,添加的新颜色成分就越高,旧颜色值值就保留的越少

glEnable(GL_BLEND);//1.开启混合

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //2.设置混合颜色因子

glDisable(GL_BLEND);//3.关闭混合

OpenGL混合因子

颜色混合总结:

1、混合函数主要用于实现在一些不透明物体前绘制透明物体的效果

2、在颜色缓存区,每个像素点只能存储一个颜色值(所有有重叠时需要混合)

颜色混合示例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351