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,在相机空间下的深度值。