OpenGL:Cubemap hack 总是有 z=1
OpenGL : Cubemap hack to always have z=1
在立方体贴图 this resource 之后,它使用了一个技巧,使立方体贴图始终位于 z=1 和 gl_Position = pos.xyww
。使用透视分割,每个像素的深度将设置为 w / w = 1
。我对此有一些疑问。
void main()
{
vec4 pos = projection * view * vec4(aPos, 1.0);
gl_Position = pos.xyww;
}
- 我不明白的是深度战斗。对于立方体贴图,在同一位置总是有 2 个可能的像素渲染,一个在我们后面,一个在我们前面,因为我们基本上是将立方体投影到平行六面体中。这样,每个像素都设置为
z=1
。所以对于给定的 (x, y)
位置,有两个可能的候选人具有相同的深度。所以用这种方法,我们不知道哪个像素在我们前面,哪个像素在我们后面。那么我们难道不应该看到与之相关的深度冲突,至少是像素的未定义值吗?如果立方体的每个面之间的纹理不同,这可能会导致问题。
以及一些辅助问题:
我们可以用gl_Position = vec4(pos.xy / pos.w, 1.0, 1.0)
代替gl_Position = pos.xyww
来达到同样的效果吗?
此外,是否保证w / w = 1
对于任何具有浮动精度的w
?如果将其设置为 1.000000001
之类的内容,则立方体贴图将永远不会显示为 GL_EQUAL
(我知道我们仍然可以使用 GL_LEQUAL
)。
剪辑是在剪辑 space 中完成的,而不是在标准化设备 space 中完成的。裁剪规则为-w < x, y, z < w
。如果 w
< 0,则不满足此规则。所以剪辑坐标 w < 0
被剪辑。在透视投影中,相机“后面”的剪辑位置具有负 w
分量。透视划分是渲染管线的一部分。当 w==z
.
时,您可以相信 z/w
为 1
您不能在顶点着色器中进行透视划分,因为透视划分从剪辑 space 转换为规范化设备 space。结果,裁剪不再有效,因为 -1 < z/w < 1
也满足 w < 0
和 z == w
.
在立方体贴图 this resource 之后,它使用了一个技巧,使立方体贴图始终位于 z=1 和 gl_Position = pos.xyww
。使用透视分割,每个像素的深度将设置为 w / w = 1
。我对此有一些疑问。
void main()
{
vec4 pos = projection * view * vec4(aPos, 1.0);
gl_Position = pos.xyww;
}
- 我不明白的是深度战斗。对于立方体贴图,在同一位置总是有 2 个可能的像素渲染,一个在我们后面,一个在我们前面,因为我们基本上是将立方体投影到平行六面体中。这样,每个像素都设置为
z=1
。所以对于给定的(x, y)
位置,有两个可能的候选人具有相同的深度。所以用这种方法,我们不知道哪个像素在我们前面,哪个像素在我们后面。那么我们难道不应该看到与之相关的深度冲突,至少是像素的未定义值吗?如果立方体的每个面之间的纹理不同,这可能会导致问题。
以及一些辅助问题:
我们可以用
gl_Position = vec4(pos.xy / pos.w, 1.0, 1.0)
代替gl_Position = pos.xyww
来达到同样的效果吗?此外,是否保证
w / w = 1
对于任何具有浮动精度的w
?如果将其设置为1.000000001
之类的内容,则立方体贴图将永远不会显示为GL_EQUAL
(我知道我们仍然可以使用GL_LEQUAL
)。
剪辑是在剪辑 space 中完成的,而不是在标准化设备 space 中完成的。裁剪规则为-w < x, y, z < w
。如果 w
< 0,则不满足此规则。所以剪辑坐标 w < 0
被剪辑。在透视投影中,相机“后面”的剪辑位置具有负 w
分量。透视划分是渲染管线的一部分。当 w==z
.
时,您可以相信 z/w
为 1
您不能在顶点着色器中进行透视划分,因为透视划分从剪辑 space 转换为规范化设备 space。结果,裁剪不再有效,因为 -1 < z/w < 1
也满足 w < 0
和 z == w
.