反投影中的W坐标

时间:2014-08-23 15:54:58

标签: opengl math glsl

我必须在着色器中执行来自渲染目标的u / v的反投影。

我的工作是:

获取NDC

2*(u,v,depth) - 1 

然后世界空间为

tmp = (P*V)^-1 * (NDC,1.0);    
world space = tmp/tmp.w;

这显然有效,但我对那里的w分歧感到困惑。为什么这个工作?不应该在某个地方乘以w(如在“前向”管道中有透视划分?)

3 个答案:

答案 0 :(得分:3)

在严格的数学意义上,你没有进行正向变换的精确反演。

如果您想要投射的NDC点的剪辑空间w值,则可以执行完全反转。在这种情况下,您可以通过将NDC坐标与w相乘来取消除以w以获得剪辑空间,并且在与反投影矩阵相乘之后,您将获得原始点,使用原始眼睛空间{{1你输入的坐标。那个通常为1,所以你完全避免将最终结果除以w。现在你有了精确的反演,其中除法被乘法反转。

它仍然按照您的方式工作,因为特定3D点的4D同质表示是尺度不变的。因此,您可以使用任何w值来表示相同的点(0除外),而不是从正向变换获得的w值。这只意味着你在同质空间中得到一些不同的点 - 你没有得到原始输入w值,而是其他东西。在实践中,这在大多数情况下并不重要,因为您不关心精确的4D同质坐标,而只关心它所代表的3D点,并且您可以通过另一个除法得到它。

答案 1 :(得分:0)

让我们说你的原始位置是(Pxyz,1),在乘以P * V后,会给你(NDC * w0,w0)

然后w除以(NDC,1)。

乘以(NDC,1)乘以(P * V)^ - 1得到(Pxyz / w0,1 / w0)。

因此,为了回到Pxyz,你将Pxyz / w0除以1 / w0。 1 / w0是tmp.w中的内容

答案 2 :(得分:-1)

如果要使用矩阵变换位置,则必须使w = 1,如果要获得3d位置,则必须指定w(使w = 1),将4D均匀变换为3d位置。 / p>