DirectX 12 – Normal Mapping 法线映射

19.4 顶点切线空间

在之前的章节中我们导出了每个三角形的切线空间(贴图空间)。但是,如果我们使用贴图空间作为法线映射,那么得到的画面表现将是三角形的,这是因为贴图空间永远是基于三角形的。因此,我们需要为每一个顶点设置切线向量,并且我们需要使用之前用于顶点法线的方法,也就是将三角形顶点的切线向量进行平均:

1. 网格模型中的某个顶点v的切线向量T是所有使用/分享该顶点的三角形的切线向量的平均值。

2. 网格模型中的某个顶点v的次切线向量T是所有使用/分享该顶点的三角形的次切线向量的平均值。

一般来说,被平均之后,三个向量TBN需要被标准化且互相垂直,这个过程被成为Gram-Schmidt。以下链接展示了如何为网格模型中的三角形构建每一个顶点的切线空间:http://www.terathon.com/code/tangent.html

我们的demo并不会存储次切线向量B。相反,在需要使用向量B时,我们会计算求出B=N×T,向量N为平均后的顶点法线向量。因此,我们的顶点结构体如下所示:

struct Vertex
{
    XMFLOAT3 Pos;
    XMFLOAT3 Normal;
    XMFLOAT2 Tex;
    XMFLOAT3 TangentU;
};

第七章中我们通过类GeometryGenerator来系统性地基于贴图空间的u轴创建了网格模型每个顶点的切线向量T。对于立方体的模型来说,我们很容易就能求出每个顶点的位于物体本地坐标系的切线向量T(如下图所示)。对于圆柱体与球体,每个顶点的切线向量T可以通过函数P(u,v)并计算基于u的倒数即可,其中u表示贴图坐标系的u轴。

从上图中我们可以看到,立方体每个面的贴图空间都是不同的。

留下评论

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