我很难理解glPolygonOffset
函数中第一个参数的含义。
void glPolygonOffset(GLfloat factor, GLfloat units);
官方文件称因素
指定用于为每个多边形创建可变深度偏移的比例因子。
和
从适当顶点的深度值插值后,每个片段的深度值将被偏移。偏移量的值是因数×DZ+r×单位,其中DZ是相对于多边形屏幕区域的深度变化的测量值,r是保证为给定实现产生可解析偏移量的最小值。
我了解什么是r
和unit
。我不明白DZ
是什么,即"测量多边形屏幕区域的深度值变化"是什么意思,以及为什么我需要将因子设置为0以外的任何值。
如果我想让我的线框偏移,我只需要在深度值上添加/减去几个单位,不是吗?因子参数(以及文件中提到的DZ)的含义、用途和用法示例是什么?
我不得不承认有些无知,但我找到了这篇文章来解释它。他们说:
为了在没有视觉伪影的情况下实现高亮显示的实体对象的良好渲染,您可以向实体对象添加正偏移(将其推离您),也可以向线框添加负偏移(将它拉向您)。最大的问题是:"多少偏移量就足够了?"不幸的是,所需的偏移量取决于各种因素,包括每个多边形的深度斜率和线框中线条的宽度。
然后他们这样解释深度斜率:
深度斜率是在遍历多边形时z(深度)值的变化除以x或y坐标的变化。深度值以窗口坐标为单位,固定在[0,1]范围内。要估计多边形的最大深度斜率(偏移方程中的m),请使用以下公式:m=max{|delV/delS|,|delV/delT|}。(其中del是偏导数)
所以他们得出结论:
对于平行于近剪裁平面和远剪裁平面的多边形,深度斜率为零。[…]对于与剪裁平面成大角度的多边形,深度斜率可能明显大于零,并且可能需要更大的偏移。因子的小的非零值,如0.75或1.0,可能足以生成不同的深度值并消除令人不快的视觉伪影。