Tangent

Unity3D法线转换与切线空间总结

空扰寡人 提交于 2020-03-23 20:48:40
3 月,跳不动了?>>> 本篇为大家总结了Unity3D中的法线转换与切线空间知识。在Shader编程中经常会使用一些矩阵变换函数接口,其实它就是把固定流水线中的矩阵变换转移到了可编程流水线或者说GPU中,先看下面的函数语句: // Transform the normal from object space to world space o.worldNormal = mul(v.normal, (float3x3)_World2Object); 在这里先给大家介绍一下,为何使用此函数,模型的顶点法线是位于模型空间下的,因此我们首先需要把法线转换到世界空间中。计算方式可以使用顶点变换矩阵的逆转置矩阵对法线进行相同的变换,因此我们首先得到模型空间到世界空间的变换矩阵的逆矩阵_World2Object,然后通过调换它在mul函数中的位置,得到和转置矩阵相同的矩阵乘法。由于法线是一个三维矢量,因此我们只需要截取_World2Object的前三行前三列即可。下面给大家展示变换Shader代码。 由于光源方向、视角方向大多都是在世界空间下定义的,所以问题就是如何把它们从世界空间变换到切线空间下。我们可以先得到世界空间中切线空间的三个坐标轴的方向表示,然后把它们按列摆放,就可以得到从切线空间到世界空间的变换矩阵,那么再对这个矩阵求逆就可以得到从世界空间到切线空间的变换: /// ///