遇到问题的场景
很多时候一个物体会具有点、线、面三种模式。如果需要同时绘制多种模式,比如以面和线模式绘制两遍模型,可能会看到线不连续,当镜头推远推近时会出现闪烁现象。
闪烁原因:
直线和多边形的光栅化方式并不完全相同,在线上和多边形边缘上产生的像素的深度值通常并不相同。
但是深度是有精度限制的,距离视点越远,精度越低,由于舍入误差会造成判断错误,进而导致渲染上问题。
解决办法:
在深度检测之前,可以对zbuffer值进行一个偏移,即多边形偏移
,为片元的z值增加一个适当的偏移值,把重合的z值适当地分开一些,使着重显示的直线与多边形的边缘清晰地分离开来。
多边形偏移
偏移值
offset = m ∗ factor + r∗units
在OpenGL和WebGL(以及基于它们的Three.js)中,当启用多边形偏移时,片元的深度值会根据以下公式调整:
-
m: 表示最大深度斜率(Maximum Depth Slope)的值,是一个根据当前渲染的多边形相对于视线的角度
自动计算
出来的值。它基本上表示该多边形表面有多倾斜;如果表面与视线平行,则m值小,如果表面近乎垂直于视线,则m值大。 -
factor: 这是一个你可以控制的变量,对应于Three.js中的material.polygonOffsetFactor。这个数值会乘以上述的m值,也就是说,它表示深度偏移量将随着多边形的视觉倾斜程度而增加。
-
r: 这是指解析度,表示深度缓冲区每个单位的更改所能表示的最小深度差异。不同的系统和深度缓冲区的配置可能具有不同的解析度。