3

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

4

1 回答 1

10

不完全是,但结果是一样的。正如您链接的问题的答案所说。在 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。如果您的矩阵是行主要的,您应该简单地转置矩阵,您就可以开始了。

希望这有帮助。

于 2013-01-30T06:57:56.320 回答