glPolygonOffset中factor参数的含义和用法

时间:2012-11-17 13:47:04

标签: c opengl graphics depth-buffer depth-testing

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

void glPolygonOffset(GLfloat  factor, GLfloat units);

The official documentation表示该因素

  

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

那个

  

每个片段的深度值在从相应顶点的深度值插值后将被偏移。偏移的值是因子×DZ + r×单位,其中DZ是相对于多边形的屏幕区域的深度变化的度量,并且r是保证给定给定的可解析偏移的最小值实施

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

如果我想让我的线框偏移,我只需要在深度值中添加/替换几个单位,不是吗? factor参数(以及文档中提到的DZ)的含义,用途和用法示例是什么?

1 个答案:

答案 0 :(得分:10)

我不得不在这里承认一些无知,但我发现this article解释了它。他们说:

  

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

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

  

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

所以他们总结说:

  

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