阴影映射中的偏置矩阵令人困惑



我对阴影映射中的偏差矩阵感到困惑。根据这个问题:阴影映射中的偏置矩阵,偏置矩阵用于缩小并转换为 [0..1]x 和 [0..1]y。所以我想象如果我们不使用偏置矩阵,纹理只会被 1/4 的场景大小填充?这是真的吗?还是这里有一些魔法?

不完全是,但结果是一样的。正如您链接的问题的答案所说。w除法后,您的坐标在NDC空间中,因此在[-1,1](x,y和z)范围内。现在,当您从纹理中采样时,您应该给出的坐标位于"纹理空间"中,OpenGL 将该空间定义为在 [0, 1] 范围内(至少对于 2D 纹理)。x=0 y=0 是纹理的左下角,x=1 y=1 是纹理的右上角。

这意味着,当您要从渲染的深度纹理中采样时,您必须将计算出的纹理坐标从 [-1, 1] 转换为 [0, 1]。如果你不这样做,纹理会很好,但只有四分之一的坐标会落在你实际想要采样的范围内。

不希望将要渲染的对象偏向深度纹理,因为 OpenGL 会将坐标从 NDC 转换为窗口坐标(在本例中,窗口是您的纹理,请使用 glViewport 进行正确的转换)。

要将偏差应用于纹理坐标,您可以使用纹理偏差矩阵,并将其乘以投影矩阵,这样着色器就不必担心。您链接的帖子已经给出了该矩阵:

const GLdouble bias[16] = {
  0.5, 0.0, 0.0, 0.0,
  0.0, 0.5, 0.0, 0.0,
  0.0, 0.0, 0.5, 0.0,
  0.5, 0.5, 0.5, 1.0};

假设您的矩阵是列主矩阵,则此矩阵应将 [-1, 1] 转换为 [0, 1],它将首先乘以 0.5,然后加上 0.5。如果你的矩阵是行主要的,你应该简单地转置矩阵,你就可以开始了。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新