OpenGL Z偏置(多边形偏移)限制

时间:2011-03-23 02:02:21

标签: opengl 3d polygon zbuffer

我有两个共面多边形。

我试过了。

glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0,1);

并期望一个明显“在另一个之上”。

这种情况直到大约70-75个单位之外(近剪裁平面为1,远剪裁平面为10,000)。然后是一个约有50个单位的区域,那里有z-fighting,然后交替的多边形似乎出现在顶部。

在正常z计算之前或之后是否添加了多边形偏移?如果它之后,我会认为它会在所有距离都“正常工作”。

我使用错误的值吗?我误解了预期的结果吗?或者这应该有效,我可能在其他地方做错了吗?

我害怕尝试更大的值,因为场景中还有其他物体,如果数量足够大,它们也可以在远距离处“跳跃”在这些物体前面。

2 个答案:

答案 0 :(得分:2)

我没有使用过glPolygonOffset,但我只是在official FAQ阅读了这篇文章 - 如果您还没有看过这篇文章,请阅读。还有man page

根据该参考,在正常Z计算之后计算偏移量,但在深度测试之前和写入深度缓冲区之前应用

我可以想到两个问题。首先,常见问题解答建议您使用glPolygonOffset(1,1),而不是(0,1)。第一个“因子”参数乘以多边形的斜率并添加到偏移量。这对于“边缘”多边形显然很重要。如果多边形面向相机,则无关紧要,但如果它是一个角度,则向前推动它所需的量会随着角度的增加而增加。

其次,您是否只为其中一个多边形启用偏移?如果您同时启用它(或忘记禁用它),那么它将应用于两个多边形,并且净效果为零。

第三,我怀疑你的深度缓冲区太大(假设深度缓冲区有双曲线刻度,有利于靠近相机的物体)。我不太确定这一点,因为glPolygonOffset应该使用深度值,而不是Z值(因此深度缓冲区的比例不应该是这里的因素)。您可能希望使用较短的深度缓冲区(可能是1000)进行尝试,看看是否会产生影响。

答案 1 :(得分:0)

您可以尝试将一个多边形偏移设置为正一个偏移负数,我敢打赌它会起作用。

glPolygonOffset(0,1)和glPolygonOffset(0,-1)