之前有一段时间,使用OpenGL ES进行图形渲染过程中: 三维空间中,两个深度相同三维实体,重叠部分出现交替闪烁的现象。
我们准备以下条件,可复现该现象:
- 先后渲染两张纹理矩形A、B;
- 两张纹理矩形深度相同,并且所在三维空间坐标部分重贴;
- 深度测试类型设置为:
glDepthFunc(GL_LEQUAL)
小于等于深度值通过 - 后渲染的纹理矩形B,覆盖先绘制的纹理矩形A。
按照以上条件,当完成渲染后: 将两个纹理矩形同时倾斜一定的角度,便会出现两张纹理交替闪烁的情况
。
原因猜测:
猜测引起纹理矩形A、B交替闪烁的根本原因是 浮点误差
。
在做深度测试的时候,将深度测试的类型改为了 glDepthFunc(GL_LEQUAL)小于等于深度值通过了
,那么理论上应该是出现 纹理矩形A 覆盖 纹理矩形B 的效果。 但在进行仿射变换(渲染操作)时,摄像机由于 浮点误差
,可能出现分不清楚,哪一个纹理矩形距离 摄像机
更近一些。
因此由于 浮点误差
,会出现纹理矩形A、纹理矩形B 交替闪烁。 (纯属个人猜测,如有不同观点者,请留言,共同讨论!)
= THE END =