非均匀缩放的正常矩阵

时间:2015-03-12 11:43:02

标签: opengl-es-2.0 glsles

我试图在OpenGL 2.0上计算我的GLSL着色器的正常矩阵。

理论是:正常矩阵是ModelView的左上3x3矩阵,转置和反转。

似乎是正确的,因为我正确地渲染了我的场景,直到我从maya导入模型并发现非均匀刻度。加载的模型有一个奇怪的光照,而我的程序模型是正确的,所以我把钱放在正常的矩阵计算上。

如何用非均匀比例计算?

2 个答案:

答案 0 :(得分:2)

您已经发现需要转置的反转矩阵来转换法线。对于缩放矩阵,这很容易计算。

非均匀3x3缩放矩阵如下所示:

[ sx  0   0  ]
[ 0   sy  0  ]
[ 0   0   sz ]

sxsysz是3个坐标方向的缩放系数。

相反的是:

[ 1 / sx  0       0      ]
[ 0       1 / sy  0      ]
[ 0       0       1 / sz ]

转置它不会改变任何内容,所以这已经是你的正常转换矩阵了。

请注意,与旋转时不同,此变换矩阵在将其应用于规范化矢量时不会保持矢量归一化。因此,在着色器中应用此矩阵后,您必须在将结果用于光照计算之前重新标准化结果。

答案 1 :(得分:0)

我只想在 Reto Koradi 的回答中添加一个实际示例。

假设您已经有一个 4x4 模型矩阵,并且还想用它来变换法线。您可以通过获取该矩阵的前 3 列的长度来推断每个轴的比例。如果现在将每一列除以相应的比例因子,矩阵将不再影响模型的比例,因为基向量将具有单位长度。

正如您所指出的,法线必须按每个轴中比例的倒数进行缩放。幸运的是,我们在第一步中已经导出了比例,所以我们可以再次对列进行划分。

所有这一切实际上意味着,如果您想从模型矩阵中导出法线的变换矩阵,您需要做的就是将前三列中的每一列除以其长度的平方(可以重写为点积)。在 GLSL 中,你会这样写:

myproject-id