【发布时间】:2014-08-23 15:54:57
【问题描述】:
我必须在着色器中从渲染目标的 u/v 执行逆投影。
我做的是:
获取 NDC 为
2*(u,v,depth) - 1
然后世界空间为
tmp = (P*V)^-1 * (NDC,1.0);
world space = tmp/tmp.w;
这显然有效,但我对那里的 w 部门感到困惑。为什么这个工作?不应该在某处乘以 w(如在“正向”管道中存在透视除法?)
【问题讨论】:
我必须在着色器中从渲染目标的 u/v 执行逆投影。
我做的是:
获取 NDC 为
2*(u,v,depth) - 1
然后世界空间为
tmp = (P*V)^-1 * (NDC,1.0);
world space = tmp/tmp.w;
这显然有效,但我对那里的 w 部门感到困惑。为什么这个工作?不应该在某处乘以 w(如在“正向”管道中存在透视除法?)
【问题讨论】:
在严格的数学意义上,您不需要进行正向变换的精确反演。
如果您拥有想要向后投影的 NDC 点的剪辑空间 w 值,则可以进行精确的反转。在这种情况下,您可以通过将 NDC 坐标与该 w 相乘来取消除以 w 以获得剪辑空间,并在与逆投影矩阵相乘后,您将获得原始点以及原始眼睛空间 w您输入的坐标。该值通常为 1,因此您完全可以避免将最终结果除以 w。现在您有了精确的反转,其中除法通过乘法反转。
它仍然按照您的方式工作,因为特定 3D 点的 4D 同质表示是尺度不变的。因此,您可以使用任何w 值代替从前向转换中获得的w 值来表示同一点(0 除外)。这只是意味着你在同质空间中得到了一些不同的点——你没有得到原始输入 w 值,而是其他的。在实践中,这在大多数情况下都无关紧要,因为您不关心确切的 4D 齐次坐标,而只关心它所代表的 3D 点,您可以通过另一个划分来获得它。
【讨论】:
gl_FragCoord.w 对吗?),就没有办法获得剪辑空间 w,我错了吗?
w,要么你没有它。但是是的,在片段着色器中,gl_FragCoord.w 将是片段的插值 1/w_clip。
假设您的原始位置是 (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 中的内容
【讨论】:
如果要使用矩阵变换位置,必须使w=1,如果要得到3d位置,则必须除w(使w=1),将4D齐次变换为3d位置。
【讨论】: