深度测试的隐患以及预防方案
2020-07-11 本文已影响0人
w執念
上一个博客中,我们通过开启深度测试,解决了甜甜圈缺口的问题,深度测试的原理就是通过判断深度值(Z值),来解决有可能出现像素点被覆盖的问题。但是由于深度缓冲区的精度是有限的,在深度相差非常小的情况下,可能会出现判断错误的情况,这也就所谓的 ZFighting 闪烁问题,具体效果如下图
ZFighting闪烁.png
解决Z-fighting闪烁问题
产生这个问题的原因,是因为两个图形的深度值极为相近,所以我们将两个图形之间的深度值间隔稍稍增大,这样两个图形间就不会产⽣干涉。这种增加间隔的方法我们称之为:多边形偏移。
那在实际代码中我们该如何使用它呢?
第一步:启⽤用 Polygon Offset
glEnable(GL_POLYGON_OFFSET_FILL)
参数列表:
- GL_POLYGON_OFFSET_POINT : 对应光栅化模式: GL_POINT
- GL_POLYGON_OFFSET_LINE :对应光栅化模式: GL_LINE
- GL_POLYGON_OFFSET_FILL :对应光栅化模式: GL_FILL
第二步:指定偏移量
通过glPolygonOffset 来指定.glPolygonOffset 需要2个参数: factor , units。
偏移量有自己的计算公式Offset = ( m * factor ) + ( r * units);但是一般而言,只需要将-1.0 和 -1 这样简单赋值给glPolygonOffset 基本可以满⾜足需求。
第三步:关闭Polygon Offset
因为作用在全局,所以每次使用完都需要关闭,还原到初始状态,避免系统资源的浪费,代码:glDisable(GL_POLYGON_OFFSET_FILL)。
Z-fighting闪烁问题预防
1.不要将两个物体靠的太近,避免渲染时叠在一起。
- 尽可能将近裁剪⾯设置得离观察者远⼀些。
- 使⽤更高位数的深度缓冲区,通常使⽤的深度缓冲区是24位的,现在有⼀些硬件使⽤32位的缓冲区,使精确度得到提⾼。