Webgl:最远平面能见度
Webgl: farthest plane visibility
好吧,我有一个非常简单的例子:只是一个 z 坐标等于 1 的三角形(没有视图或投影矩阵)。坐标为:
0.0, 0.6, 1.0
-0.5, -0.4, 1.0
0.5, -0.4, 1.0
所以那个三角形位于最远的平面上。 DEPTH_TEST 已禁用。
三角形是可见的,因为 -1 <= z <= 1。
但是当我启用 DEPTH_TEST:
gl.enable(gl.DEPTH_TEST);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
三角形不再可见。当我将所有 z 坐标更改为 -1(因此它在最近的平面上)时,它再次变得可见。
那么为什么在最远的平面上看不到它呢?
1) 是 webgl 错误 2) 是 webgl/opengl 功能吗? 3) 如果它是一项功能,为什么它以这种方式工作?
初始值glDepthFunc
is GL_LESS
, so even if you set glClearDepthf
为1.0,比较1.0 < 1.0为false,因此片段将被丢弃。
您可以尝试设置glDepthFunc(GL_LEQUAL)
。
请注意,您还应该注意浮点数问题。比较完全相等总是有问题的。即使您不变换对象 space 坐标并在顶点着色器中传递它们,z 值也会从 NDC 范围 [-1,1] 变换到 window space 范围 [0,1](或您使用 glDepthRangef
设置的任何值)。不过,对于 -1 和 1 输入情况,这应该不是问题,因为中间结果应该可以准确表示而不会损失精度。
好吧,我有一个非常简单的例子:只是一个 z 坐标等于 1 的三角形(没有视图或投影矩阵)。坐标为:
0.0, 0.6, 1.0
-0.5, -0.4, 1.0
0.5, -0.4, 1.0
所以那个三角形位于最远的平面上。 DEPTH_TEST 已禁用。 三角形是可见的,因为 -1 <= z <= 1。 但是当我启用 DEPTH_TEST:
gl.enable(gl.DEPTH_TEST);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
三角形不再可见。当我将所有 z 坐标更改为 -1(因此它在最近的平面上)时,它再次变得可见。
那么为什么在最远的平面上看不到它呢? 1) 是 webgl 错误 2) 是 webgl/opengl 功能吗? 3) 如果它是一项功能,为什么它以这种方式工作?
初始值glDepthFunc
is GL_LESS
, so even if you set glClearDepthf
为1.0,比较1.0 < 1.0为false,因此片段将被丢弃。
您可以尝试设置glDepthFunc(GL_LEQUAL)
。
请注意,您还应该注意浮点数问题。比较完全相等总是有问题的。即使您不变换对象 space 坐标并在顶点着色器中传递它们,z 值也会从 NDC 范围 [-1,1] 变换到 window space 范围 [0,1](或您使用 glDepthRangef
设置的任何值)。不过,对于 -1 和 1 输入情况,这应该不是问题,因为中间结果应该可以准确表示而不会损失精度。