在 OpenGL 中计算法线矩阵

Posted

技术标签:

【中文标题】在 OpenGL 中计算法线矩阵【英文标题】:Calculating the Normal Matrix in OpenGL 【发布时间】:2013-09-22 07:58:46 【问题描述】:

以下站点说在计算法线矩阵时使用 model_view 矩阵(假设我们没有使用内置的 gl_NormalMatrix):(site)Light House。我的程序中有以下算法:

//Calculate Normal matrix

// 1. Multiply the model matrix by the view matrix and then grab the upper left
// corner 3 x 3 matrix.
mat3x3 mv_orientation = glext::orientation_matrix<float, glext::column>(
  glext::model_view<float, glext::column>(glext_model_, glext_view_));

// 2. Because openGL matrices use homogeneous coordinate an affine inversion
// should work???
mv_orientation.affine_invert();

// 3. The normal matrix is defined as the transpose of the inverse of the upper
// left 3 X 3 matrix
mv_orientation.transpose();

// 4. Place this into the shader
basic_shader_.set_uniform_3d_matrix("normal_matrix", mv_orientation.to_gl_matrix());

假设上述代码中的大多数语句都是正确的。在法线矩阵的计算中不包括投影矩阵吗?如果不是为什么,投影矩阵不会像点一样影响法线吗?

【问题讨论】:

【参考方案1】:

这是因为projection 不是affine transformation。投影不保持内积,然后它们不保持角度。而真正影响光漫射和反射的角度是仿射 3d 空间中的角度。因此,同时使用投影矩阵会得到不同的角度、错误的角度,从而导致错误的灯光。

【讨论】:

【参考方案2】:

在法线矩阵的计算中不包括投影矩阵吗?

没有。在世界和/或视图空间中发生的计算(例如照明)需要法线。从你的数学角度来看,在投影后这样做是没有意义的。

如果不是为什么,投影矩阵不会像点一样影响法线吗?

因为这没有任何意义。法线不应进行投影变换是拥有单独投影矩阵的最初原因。如果你将法线通过投影,它们就会失去意义和有用性。

【讨论】:

以上是关于在 OpenGL 中计算法线矩阵的主要内容,如果未能解决你的问题,请参考以下文章

现代 OpenGL:VBO、GLM 和矩阵堆栈

✠OpenGL-10-增强表面细节

光照在 OpenGL 中不显示

openGL中的法向量问题

OpenGL顶点着色器的NormalMatrix?

OpenGL 可编程管线 基础光照 的实现