z-fighting

[TOC]

参考资料

现象

距离相近的物体会发生闪烁,无法判断二者深度。

产生原因

透视投影矩阵最后推导可得到下列公式

其中Zn是ndc下的深度值,Ze是相机坐标系下的坐标值。
可见Zn和Ze不是线性关系,是成反比的关系。距离视点越远的物体,其深度值越不精确,而越近的则越精确了。

解决方法

增加深度值的精度

OpenGL可以设置glPolygonOffset

深度值的非线性与线性的转化

gl_FragCoord.z * 2 -1 = (-(f +n)/(f - n) *Ze - (2 * f * n)/(f - n))/-Ze;

求得Ze,在相机空间下的深度值。