这个问题现在比较少见, 我们先来看看具体表现
ZFighting 闪烁现象
为什么会出现 ZFighting 闪烁问题
ZFighting错误.png ZFighting正确.png因为开启深度测试后,OpenGL 就不会再去绘制模型被遮挡的部分. 这样实现的显示更加真实.但是由于深度缓冲区精度的限制对于深度相差非常⼩的情况下.(例如在同一平面上进行2次绘制),OpenGL 就可能出现不能正确判断两者的深度值,会导致深度测试的结果不可预测.显示出来的现象是交错闪烁. 现在的设备精度在开发中很少遇到这种情况,
解决方案: 开启多边开偏移 Polygon Offset
第⼀步: 启用 Polygon Offset ⽅式解决.
glEnable(GL_POLYGON_OFFSET_FILL)
第二步: 指定偏移量.
通过 glPolygonOffset 来指定. glPolygonOffset 需要2个参数: factor , units
每个 Fragment 的深度值都会增加如下所示的偏移量:
m : 多边形的深度的斜率的最大值,理解一个多边形越是与近裁剪面平行,m 就越接近于0.
r : 能产生于窗口坐标系的深度值中可分辨的差异最小值.r 具体是由OpenGL 平台指定的 一个常量
一个大于0的Offset 会把模型推到离你(摄像机)更远的位置,相应的一个小于0的Offset 会把模型拉近
一般⽽言,只需要将-1.0 和 -1 这样简单赋值给 glPolygonOffset 基本可以满⾜需求.
网友评论