13

我很难理解glPolygonOffset函数中第一个参数的含义。

void glPolygonOffset(GLfloat  factor, GLfloat units);

官方文档说这个因素

指定用于为每个多边形创建可变深度偏移的比例因子。

然后

每个片段的深度值将在从适当顶点的深度值插值后偏移。offset 的值是 factor × DZ + r × units ,其中 DZ 是相对于多边形屏幕区域的深度变化的度量,而 r 是保证在给定的情况下产生可解析偏移的最小值执行。

我明白什么runit是什么。我不明白的是什么DZ,即“测量多边形屏幕区域的深度值变化”是什么意思,为什么我需要将因子设置为 0 以外的任何值。

如果我希望我的线框被偏移,我只需要在深度值上添加/减去几个单位,不是吗?factor参数(以及文档中提到的DZ)的含义、用途和使用示例是什么?

4

1 回答 1

18

我不得不承认这里有些无知,但我发现这篇文章解释了它。他们说:

要在没有视觉伪影的情况下对突出显示的实体对象进行良好渲染,您可以向实体对象添加正偏移(将其推离您)或向线框添加负偏移(将其拉向您)。最大的问题是:“多少偏移量才足够?” 不幸的是,所需的偏移量取决于各种因素,包括每个多边形的深度斜率和线框中线条的宽度。

然后他们以这种方式解释深度斜率:

深度斜率是当您遍历多边形时,z(深度)值的变化除以 x 或 y 坐标的变化。深度值在窗口坐标中,限制在 [0, 1] 范围内。要估计多边形的最大深度斜率(偏移方程中的 m),请使用以下公式:m = max {|delV / delS|,|delV / delT|}。(其中 del 是偏导数)

所以他们得出结论:

对于平行于近剪裁平面和远剪裁平面的多边形,深度斜率为零。[...] 对于与剪裁平面成很大角度的多边形,深度斜率可能显着大于零,并且可能需要更大的偏移量。因子的小非零值(例如 0.75 或 1.0)可能足以生成不同的深度值并消除令人不快的视觉伪影。

于 2012-11-17T15:21:56.503 回答