DirectX 12 – Normal Mapping 法线映射

19.3 贴图/切线空间

假设我们在将贴图映射到3D空间的三角形上时贴图并没有发生扭曲或者变形;换句话说,在将贴图映射到三角形时,我们只需要一个刚体转换矩阵(矩阵只包含位移与旋转)。假设贴图是一个贴花(decal),而我们使其在3D空间的三角形上进行位移与旋转。下图展示了贴图空间坐标系的坐标轴是如何与3D空间内的三角形相关联的:它们是三角形的切线且位于三角形平面。同时,三角形的贴图坐标也与贴图坐标系相关联。三角形的法线所在的平面,我们称之为贴图空间(texture space)或者切线空间(tangent space)。需要注意的是一般来说,每一个三角形的切线空间都是不同的。

上图展示了三角形的贴图空间与物体本地空间的关系。3D切线向量T指向贴图坐标系的u轴的方向,3D切线向量B指向贴图坐标系的v轴的方向。

根据上一小节的图片,我们可以发现法线映射贴图中的法线都是基于贴图空间。但是场景中的光源位置与光线向量都是基于世界坐标系。为了计算光照效果,法线向量与光线向量需要位于同一个空间。所以,第一步就是将三角形的切线空间与三角形所属物体的本地空间进行关联。当法线位于物体本地空间后,我们可以使用物体的世界矩阵将法线转换至世界空间(我们将在下一小节学习实现的细节)。假设v0,v1,v2定义了3D空间内三角形的三个顶点,其相对应的贴图坐标(u0,v0),(u1,v1),(u2,v2)则在贴图平面内基于贴图坐标系的坐标轴(TB)定义了一个三角形。如果e0=v1-v0且e1=v2-v0定义了3D空间内三角形两边的向量,其对应的三角形位于贴图空间内两边的向量为(Δu0,Δv0)=(u1-u0,v1-v0),(Δu1,Δv1)=(u2-u0,v2-v0)。而从上图我们可以求出以下等式:

而我们可以使用物体本地坐标系来表示以上两个向量,而矩阵等式为:

由于我们知道顶点在物体本地空间内的坐标值,因此我们也能求出代表三角形两边的向量在物体本地空间的坐标值,所以以下矩阵是已知的。

同样,由于我们已经有了顶点的贴图坐标,所以以下矩阵是已知的。

因此我们可以通过以下等式求出位于物体本地空间的向量T与向量B

我们需要注意的是,在转换为物体本地坐标系后,向量T与向量B通常不是单位向量,如果贴图有拉伸或者变形,那么这两个向量可能不会互相垂直。向量T,向量B,向量N分别表示切线向量,次法线(次切线)向量,法线向量。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据