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


我正在做一个每片段照明,当纠正正常的vecter时,我得到了这个代码: vec3 f_normal = mat3(MVI) * normal; MVI在哪里: mat4 MVI = transpose(inverse(ModelViewMatrix));。那么之后的回报是什么 mat3(MVI) 声明?


5512
2018-06-04 10:31


起源

好吧,简单的推理(只是对计算机图形学的数学基础的一点点了解)就要求它是左上角的3x3部分。除此之外,一定不要在着色器中转置和反转矩阵。它不会改变每个顶点,并且可以在CPU上完成(对于单个矩阵不再需要它)。 - Christian Rau


答案:


mat3(MVI) * normal

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

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


13
2018-06-04 22:28



使用模型视图矩阵的上3x3只有在没有非均匀比例时才有效,否则你必须使用模型视图的反转置(这是一个4x4矩阵)。请注意,当乘以4x4矩阵时,必须将法线的w分量设置为零。
@racarate正确。我会修改我的答案,以避免让人误解。 - Stephan van den Heuvel


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


3
2018-06-04 10:38



感谢您快速回复,这对最终结果有影响吗? (为什么它不使用法线向量中的第四个元素但是删除MVI上的一些元素?) - Bình Nguyên
这是一个通用操作,并且不知道正在操作的底层矩阵的语义。 - Alexander Pavlov