glsl中的提取mat3(mat4矩阵)语句有什么用?

时间:2012-06-04 10:31:41

标签: opengl glsl

我正在进行每个片段的照明,并且当校正正常的矢量时,我得到了这个代码:vec3 f_normal = mat3(MVI) * normal;其中MVI是:mat4 MVI = transpose(inverse(ModelViewMatrix));。那么mat3(MVI)陈述后的回报是什么?

2 个答案:

答案 0 :(得分:14)

mat3(MVI) * normal

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

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

答案 1 :(得分:3)

GLSL types“从另一个矩阵进行矩阵构造时,对大小没有限制。所以你可以用2x4矩阵构造一个4x2矩阵;只复制相应的元素。” EM>。因此,你得到了MVI左上角的3x3子矩阵。