发布网友 发布时间:2022-12-22 07:13
共1个回答
热心网友 时间:2023-10-15 20:06
甜甜圈旋转两部分重叠时,此时OpenGL不能区分哪个图层在前,哪个图层在后就会出现缺少一部分的现象。解决此问题需了解新概念--深度测试。
深度测试的使用
开启深度测试
关闭深度测试
在绘制场景前,清除颜⾊缓存区,深度缓冲。清除深度缓冲区默认值为1.0。
指定深度测试判断模式
打开/阻断 深度缓存区写入
开启深度测试甜甜圈。
ZFighting闪烁原因:开启深度测试后,OpenGL 就不会再去绘制模型被遮挡的部分。这样实现的显示更加真实。但是由于深度缓冲区精度的*对于深度相差非常⼩的情况下。(例:在同一平⾯上进行2次绘制),OpenGL就可能出现不能正确判断两者的深度值,会导致深度测试的结果出现随机。前⾯2个画⾯,交错出现。就会出现闪烁问题。
解决方式
ZFighting闪烁问题预防
在OpenGL 中提高渲染的⼀种⽅式,只刷新屏幕上发生变化的部分。OpenGL 允许将要进行渲染的窗⼝只去指定⼀个裁剪框。
基本原理
用于渲染时*绘制区域,通过此技术可以在屏幕(帧缓冲)指定一个矩形区域。启用剪裁测试之后,不在此矩形区域内的片元被丢弃,只有在此矩形区域内的⽚元才有可能进入帧缓冲。因此,实际达到的效果就是在屏幕上开辟了一个⼩窗口,可以在其中进⾏指定内容的绘制。
理解窗口、视口、裁剪区域
OpenGL渲染时会把颜色值存在颜⾊缓存区中,每个⽚段的深度值也是放在深度缓冲区。
颜色混合
设置混合因子
混合方程式
实际上不止一种颜色混合方程式,OpenGL有5个不同的方程式进行选择。
常量混合颜色
glBlendFuncSeparate函数
除了能使⽤OpenGL内置的混合因⼦,还可以有更灵活的选择。
举例
例:使用常见的混合函数组合
如果颜色缓存区已经有一种颜⾊红色(1, 0, 0, 0)
在这上面混合一种alpha为0.6的蓝色(0, 0, 1, 0.6)
最终颜色是以原先的红色(⽬标颜色)与后来的蓝色(源颜色)进⾏组合。源颜色的alpha值越高,添加的蓝色颜色成分越高,⽬标颜⾊所保留的成分就会越少(事例结果如图3)。
颜色混合Demo