7

GL wiki上,他们建议使用 GL_LEQUAL 作为深度函数。此外,深度函数默认为 GL_LESS。当我使用这些功能中的任何一个时,我都会得到奇怪的结果。在这张图片中,红色方块应该在蓝色方块的前面(两个方块大小相同): 与 GL_LESS

但是,如果我使用glClearDepth(0.0)and then glDepthFunc(GL_GREATER),运行其他未更改的程序,我会得到: 与 GL_GREATER

再想一想,GL_LESS 会给出它所做的结果是有道理的:如果传入的深度值小于存储的深度值,则写入片段。

如果我将相机定位在(1, 0, 0)并看向(0, 0, 0)我希望一个对象位于(0.5, 0, 0)的一个对象前面(0, 0, 0)。使用 GL_LESS 的对象不会(0, 0, 0)是其片段被写入的对象吗?

编辑:尼科尔,感谢您提到投影矩阵。好像设置不正确。我在 arcsynthesis.org 上关注了你的教程一段时间,并将代码调整到我自己的项目中,但我偏离了你的投影矩阵,并使用 glFrustum 手册页上描述的数学来实现我自己的该函数版本,然后使用 NeHe 的 gluPerspective替换以替换 gluPerspective。我不知道为什么替换不起作用,因为我的矩阵数学是正确的(我已经对照各种在线计算器进行了检查)。使用您的矩阵,我使用 GL_LESS 得到了正确的结果。

4

2 回答 2

20

为什么 GL_LEQUAL 推荐用于 GL 深度函数

着色器。多通道 alphablended 闪电(可能带有凹凸贴图)。为此,您必须多次在相同的位置/深度上绘制相同的对象,但使用不同的着色器/混合参数和深度测试应该启用(深度写入可以在第一次过去后禁用)。GL_LESS 将切断第二遍以及之后的每遍。GL_LEQUAL 不会,照明会正常工作。

GL_LEQUAL 本身不会引起z-fighting,当您有两个几乎平行的多边形共享几乎相同的位置时会发生z-fighting。可以通过增加深度缓冲区精度来减少影响。在过去,它也可以通过使用 w-buffer(至少在 DirectX 中)来减少,但 AFAIK 这个功能不再流行了。

在这张图片中,红色方块应该在蓝色方块的前面(两个方块大小相同):

没有源代码就无法正确回答。

于 2012-01-30T00:01:27.130 回答
2

如果我将相机定位在 (1, 0, 0) 并朝 (0, 0, 0) 看去,我希望 (0.5, 0, 0) 处的对象位于 (0, 0, 0) 处的对象前面. 使用 GL_LESS 不会是 (0, 0, 0) 处的对象是其片段被写入的对象吗?

根据此链接:http ://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.opengl/doc/openglrf/glDepthFunc.htm%23b5afa88027vbia ,

glDepthFunc 子例程指定用于将每个输入像素 z 值与深度缓冲区中存在的 z 值进行比较的函数。”它还指出:“如果输入 z 值小于存储的 z 值,则 GL_LESS 通过。

这里:z 值是相机到物体的距离。这导致在屏幕上绘制更近的对象。这也在这里解释:http ://www.glprogramming.com/red/chapter10.html

我引用最后一个链接:

深度缓冲区

深度缓冲区存储每个像素的深度值。正如第 5 章“A Hidden-Surface Removal Survival Kit”中所述,深度通常以到眼睛的距离来衡量,因此具有较大深度缓冲区值的像素会被具有较小值的像素覆盖。然而,这只是一个有用的约定,深度缓冲区的行为可以按照“深度测试”中的描述进行修改。深度缓冲区有时称为 z 缓冲区(z 来自于 x 和 y 值测量屏幕上的水平和垂直位移,而 z 值测量垂直于屏幕的距离)。

于 2014-10-15T22:37:49.037 回答