OpenGL ZFighting闪烁

缘由

出现ZFighting闪烁问题的缘由是由于,咱们打开深度测试后,OpenGL就不会绘制模型背遮挡的部分,可是因为深度缓冲区的精度限制,假如两个二者深度很是接近的时候,OpenGL 就没法正确判断出二者的深度值,会致使渲染的结果没法预测,显示出来的图像交错闪烁。(以下图时而渲染出绿色,时而渲染出红色,没法肯定,交错闪烁) bash

ZFighting闪烁
ZFighting闪烁

问题解决

第一步:启⽤用 Polygon Offset ⽅方式解决

解决⽅法: 让深度值之间产生间隔.在执行深度测试前将立方体的深度值作一些细微的增长.因而就能将重叠的2个图形深度值之间有所区分 //启用Polygon Offset glEnable(GL_POLYGON_OFFSET_FILL) 参数列表: GL_POLYGON_OFFSET_POINT GL_POLYGON_OFFSET_LINE GL_POLYGON_OFFSET_FILL测试

第二步:指定偏移量
void glPolygonOffset(Glfloat factor,Glfloat units);

应⽤到片断上总偏移计算⽅方程式:
Depth Offset = (DZ * factor) + (r * units); DZ:深度值(Z值)

r:使得深度缓冲区产生变化的最小值
负值,将使得z值距离咱们更近,而正值,将使得z值距离咱们更远,咱们设置factor和units设置为-1,-1
复制代码
第三步: 关闭Polygon Offset

glDisable(GL_POLYGON_OFFSET_FILL)spa

问题预防

  • 不要将两个物体靠的太近,避免渲染时三角形叠在⼀一块儿。这种方式要求对场景中物体插入一个少量的偏移,那么就可能避免ZFighting现象。例如⽴⽅体和平面问题中,将平面下移0.001f就能够解决这个问题。固然⼿动去插入这个小的偏移是要付出代价的。
  • 尽量将近裁剪⾯设置得离观察者远一些。尽量让近裁剪⾯远一些的话,会使整个裁剪范围内的精确度变高一些。可是这种方式会使离观察者较近的物体被裁减掉,所以须要调试好裁剪面参数
  • 离观察者较近的物体被裁减掉,所以须要调试好裁剪面参数。 使用更高位数的深度缓冲区,一般使用的深度缓冲区是24位的,如今有一些硬件使用32位的缓冲区,使精确度获得提⾼
相关文章
相关标签/搜索