我试图在OpenGL 2.0上计算我的GLSL着色器的正常矩阵。
理论是:正常矩阵是ModelView的左上3x3矩阵,转置和反转。
似乎是正确的,因为我正确地渲染了我的场景,直到我从maya导入模型并发现非均匀刻度。加载的模型有一个奇怪的光照,而我的程序模型是正确的,所以我把钱放在正常的矩阵计算上。
如何用非均匀比例计算?
答案 0 :(得分:2)
您已经发现需要转置的反转矩阵来转换法线。对于缩放矩阵,这很容易计算。
非均匀3x3缩放矩阵如下所示:
[ sx 0 0 ]
[ 0 sy 0 ]
[ 0 0 sz ]
sx
,sy
和sz
是3个坐标方向的缩放系数。
相反的是:
[ 1 / sx 0 0 ]
[ 0 1 / sy 0 ]
[ 0 0 1 / sz ]
转置它不会改变任何内容,所以这已经是你的正常转换矩阵了。
请注意,与旋转时不同,此变换矩阵在将其应用于规范化矢量时不会保持矢量归一化。因此,在着色器中应用此矩阵后,您必须在将结果用于光照计算之前重新标准化结果。
答案 1 :(得分:0)
我只想在 Reto Koradi 的回答中添加一个实际示例。
假设您已经有一个 4x4 模型矩阵,并且还想用它来变换法线。您可以通过获取该矩阵的前 3 列的长度来推断每个轴的比例。如果现在将每一列除以相应的比例因子,矩阵将不再影响模型的比例,因为基向量将具有单位长度。
正如您所指出的,法线必须按每个轴中比例的倒数进行缩放。幸运的是,我们在第一步中已经导出了比例,所以我们可以再次对列进行划分。
所有这一切实际上意味着,如果您想从模型矩阵中导出法线的变换矩阵,您需要做的就是将前三列中的每一列除以其长度的平方(可以重写为点积)。在 GLSL 中,你会这样写:
myproject-id