我对阴影贴图中的偏差矩阵感到困惑。根据这个问题:bias matrix in shadow mapping,偏差矩阵用于缩小并转换为[0..1] x和[0..1] y。所以我认为如果我们不使用偏置矩阵,纹理只会被1/4场景大小填充?真的吗?或者这里有一些魔力吗?
答案 0 :(得分:7)
不完全,但结果是一样的。作为你联系的问题的答案说。在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转换为窗口坐标(在这种情况下,窗口是你的纹理,使用{ {1}}为你做正确的转变。
要将偏差应用于纹理坐标,您可以使用纹理偏差矩阵,并将其乘以投影矩阵,因此着色器不必担心它。您链接的帖子已经给出了该矩阵:
glViewport
如果你的矩阵是列主要的,这个矩阵应该将[-1,1]变换为[0,1],它首先乘以0.5,然后加0.5。如果你的矩阵是行主要的,你应该简单地转置矩阵,你就可以了。
希望这会有所帮助。