gpt4 book ai didi

opengl - 透视除法 : Why use the w component?

转载 作者:行者123 更新时间:2023-12-03 23:15:30 26 4
gpt4 key购买 nike

在 OpenGL 中,我读到顶点应该用 (x,y,z,w) 表示,其中 w = z。这是为了启用透视分割,其中 (x,y,z) 除以 w 以确定由于透视效果它们的屏幕位置。如果它们只是除以原始 z 值,那么 z 处处都是 1。

我的问题是:为什么你需要将 z 分量除以 w?为什么不能直接将x和y分量除以z,让屏幕坐标应用透视效果,然后就用原来的未修改的z分量进行深度测试?这样,您根本不必使用 w 组件....

显然我错过了一些东西!

最佳答案

3D 计算机图形通常使用 homogeneous coordinates 处理并在 projective vector space .这背后的数学不仅仅是“除以 w”。

使用 4D 齐次向量和 4x4 矩阵有一个很好的优势,即各种仿射变换(尤其包括平移,也依赖于 w)和投影变换可以通过简单的矩阵乘法来表示。

In OpenGL, I have read that a vertex should be represented by (x, y, z, w), where w = z.



那不是真的。一个顶点应该用 (x, y, z, w) 表示,其中 w 就是 w。在您的典型情况下,输入 w 实际上是 1,因此它通常不存储在顶点数据中,而是按需添加到着色器等中。

您的典型投影矩阵将设置 w_clip = -z_eye .但那是另一回事。这意味着您只需沿着 -z 投影即可。眼空间的方向。您也可以输入 w_clip=2 *x_eye -3*y_eye + 4 * z_eye在那里,您的投影轴将具有方向 (2, -3, 4, 0)。

My question is: Why do you need to divide the z component by w at all? Why can you not just divide the x and y components by z, such that the screen coordinates have the perspective effect applied, and then just used the original unmodified z component for depth testing?



从概念上讲,空间在所有 3 个维度上都是扭曲的,而不仅仅是在 x 和 y 上。此外,一开始,GPU 的深度缓冲区只有 16 位或 24 位整数精度。在这种情况下,您肯定希望在相机附近有一个更密集的表示,而在远处有一个稀疏的表示。

如今,有了可编程顶点着色器和浮点深度缓冲格式,您基本上可以只存储 z_eye深度缓冲区中的值,并将其用于深度测试。但是,这通常称为 W buffering ,因为使用了(裁剪空间)w 分量。

如果您除以 z,还有另一个概念问题:您将无法使用正交投影,您总是会强制使用某种透视。现在有人可能会争辩说,除以 z 不必自动发生,但可以在顶点着色器中需要时应用它。但这也行不通。您不能在顶点着色器中应用透视分割,因为这会投影位于摄像机前面的摄像机后面的点。由于顶点着色器不适用于整个图元,如果至少一个顶点位于相机后面而另一个顶点位于其前面,这将完全搞砸那里的任何图元。为了处理这种情况,必须在划分之前应用剪辑——因此命名剪辑空间。

In this way, you would not have to use the w component at all.



这也不是真的。 w 组件在管道中进一步使用。它对于透视正确的属性插值至关重要。

关于opengl - 透视除法 : Why use the w component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com