當我們要在頂點着色器中計算光時,我們需要視圖空間中的法向量。一般來說,它看起來如下(從OpenGL Superbible 5th開始):將頂點變換爲頂點着色器中的視圖空間
// normalMatrix is retrieved from GLMatrixStack modelViewMatrix
vec3 vEyeNormal = normalMatrix * vNormal
我想在不使用GLT庫的情況下編寫程序。在另一個源(http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Diffuse_Reflection)我發現下面的公式:
vec3 normalDirection = normalize(m_3x3_inv_transp * v_normal);
可變m_3x3_inv_transp計算如下:
glm::mat3 m_3x3_inv_transp = glm::transpose(glm::inverse(glm::mat3(mesh.object2world)));
我意識到:
- 普通矩陣是僅旋轉分量因爲 法向量的翻譯是不可接受的。
- 秩序的OpenGL操作是Scalng,平移,旋轉 (Opengl order of matrix transformations)
- 反演矩陣是撤消上次的變換 (http://tomdalling.com/blog/modern-opengl/04-cameras-vectors-and-input/)
我的問題是,爲什麼反演和transponsing矩陣後,我得到NormalMatrix以及如何檢查它與逆向計算?基於對3D遊戲編程和計算機圖形(由埃裏克·倫蓋爾)數學第66頁
感謝您在我的思考和簡單實用的答案中發現錯誤。 – CppMonster