【问题标题】:W coordinate in inverse projection逆投影中的 W 坐标
【发布时间】: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(如在“正向”管道中存在透视除法?)

【问题讨论】:

    标签: opengl math glsl


    【解决方案1】:

    在严格的数学意义上,您不需要进行正向变换的精确反演。

    如果您拥有想要向后投影的 NDC 点的剪辑空间 w 值,则可以进行精确的反转。在这种情况下,您可以通过将 NDC 坐标与该 w 相乘来取消除以 w 以获得剪辑空间,并在与逆投影矩阵相乘后,您将获得原始点以及原始眼睛空间 w您输入的坐标。该值通常为 1,因此您完全可以避免将最终结果除以 w。现在您有了精确的反转,其中除法通过乘法反转。

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

    【讨论】:

    • 谢谢!我想如果我不转换当前像素(w 应该是 1/gl_FragCoord.w 对吗?),就没有办法获得剪辑空间 w,我错了吗?
    • @fayeWilly:我不确定我是否得到这个问题。要么,你有来自正向变换的w,要么你没有它。但是是的,在片段着色器中,gl_FragCoord.w 将是片段的插值 1/w_clip
    【解决方案2】:

    假设您的原始位置是 (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 中的内容

    【讨论】:

      【解决方案3】:

      如果要使用矩阵变换位置,必须使w=1,如果要得到3d位置,则必须除w(使w=1),将4D齐次变换为3d位置。

      【讨论】:

      • 你说的是透视分割。但问题是另一回事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多