DevLog1 AYRenderer
开发日志 AYRenderer
渲染Pass,VertexShader
模型矩阵与法线矩阵
在AYRenderer的UI界面中,用户可以自行设置渲染物体的 Transform :
这个 Transform 会形成所谓的 Model 矩阵,在顶点着色器(VertexShader)中会用到这个矩阵来对顶点进行变换。(即M变换)
当然所谓的顶点不只有位置和旋转的属性,还有法线属性,而法线的变换所对应的 Normal Matrix 则是 Model Matrix 的逆转置矩阵:
1 | Mat4 modelMatrix = object.transform.GetModelMatrix(); |
我们来证明一下,首先假设模型空间中某顶点对应的切线为 t⃗,该切线可以由模型空间的两个顶点 A, B 表示: t⃗ = B − A.
经过模型变换后,对应的切线 $\vec{t'}$ 为: $$ \vec{t'} = MB - MA = M(B - A) = M\vec{t}. $$
因此切线的变换和顶点位置变换是一样的,都是由模型矩阵 M 表示。
然后我们考虑模型空间中该顶点的法线属性 n⃗,法线是垂直于切线的,因此有: n⃗Tt⃗ = 0.
在世界空间中,该法线属性为 $\vec{n'}$,同样需要满足垂直于切线 $\vec{t'}$ 的条件: $$ \vec{n'}^T \vec{t'} = 0. $$
假设法线的变换矩阵为 N,则有: $$ \vec{n'} = N \vec{n}. $$
因此有: $$ \vec{n'}^T \vec{t'} = (N \vec{n})^T (M \vec{t}) = \vec{n}^T N^T M \vec{t} = 0. $$
我们需要让 NTM = I,即 N = (MT) − 1,这就证明了法线矩阵是模型矩阵的逆转置矩阵。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
