开启深度测试后, 如果深度值误差很小,由于深度缓冲区精度有限,此时OpenGL会出现无法判断的情况,导致画面交错闪烁的现象。
如图,红框和绿框重叠部分,它们深度值过于相近,无法分别出图层的先后顺序,便会出现红绿闪烁的情况。
处理该问题可以采用在绘制前开启多边形偏移
的方案
- 开启多变形偏移
glEnable(GL_POLYGON_OFFSET_FILL)
多边形偏移枚举值 | 对应的图像填充模式 |
---|---|
GL_POLYGON_OFFSET_POINT | GL_POINT |
GL_POLYGON_OFFSET_LINE | GL_LINE |
GL_POLYGON_OFFSET_FILL | GL_FILL |
用哪种方式填充的图像,就开启对应的偏移.
- 指定偏移量
glPolygonOffset (GLfloat factor, GLfloat units)
;参数一般填 -1 和 -1
- 指定偏移量
- 在绘制完成后,关闭多边形偏移
glDisable(GL_POLYGON_OFFSET_FILL)
预防ZFighting闪烁
- 在绘制完成后,关闭多边形偏移
z-fighting问题的预防:
- 避免两个物体靠的太近:在绘制时,插入一个小偏移
- 将近裁剪面(设置透视投影时设置)设置的离观察者远一些:提高裁剪范围内的精确度
- 使用更高位数的深度缓冲区:提高深度缓冲区的精确度
网友评论