16

我正在做每个片段照明,并且在校正正常矢量时,我得到了这个代码:vec3 f_normal = mat3(MVI) * normal;MVI 在哪里:mat4 MVI = transpose(inverse(ModelViewMatrix));。那么什么是return after mat3(MVI)statement呢?

4

2 回答 2

19
mat3(MVI) * normal

从 4x4 矩阵返回上面的 3x3 矩阵,并将法线乘以该矩阵。该矩阵称为“正常矩阵”。你用它把你的法线从世界空间带到眼睛空间。矩阵的上 3x3 部分对于缩放和旋转很重要,而其余部分仅用于平移(法线从不平移)

要将法线从世界空间带到眼睛空间,您只需要模型视图矩阵的 3x3 逆转置。除非您的矩阵在正常情况下(没有非均匀比例),否则在这种情况下,原始矩阵与其逆转置相同。

于 2012-06-04T22:28:54.037 回答
3

来自GLSL 类型“从另一个矩阵构造矩阵时对大小没有限制。因此您可以从 2x4 矩阵构造一个 4x2 矩阵;只复制相应的元素。” . 因此,您会得到 MVI 的左上角 3x3 子矩阵。

于 2012-06-04T10:38:37.533 回答