18.4 顶点正切空间

在上一节中,我们为三角形推导了一个正切空间。不过,当进行法线贴图映射时,我们希望以三角形的形式描述该正切空间,因为正切空间在三角形平面上是一个常量。所以,我们在每个顶点上指定切线向量,就像是使用顶点法线来模拟一个光滑表面时所做的事情一样:

1.对于网格中的任意一个顶点v,它的切线向量T等于共享该顶点的每个三角形的切线向量的平均值。

2.对于网格中的任意一个顶点v,它的副切(法)线向量B等于共享该顶点的每个三角形的副切(法)线向量的平均值。

在计算平均值之后,我们通常需要对TBN基进行正交化处理,使这3个向量彼此垂直并为单位向量。这一工作通常使用Gram-Schmidt算法来完成。读者可以在网上找到能为任意三角形网格生成顶点切线空间的代码:http://www.terathon.com/code/tangent.php。

这里,我们不直接在内存中存储副切线向量B。而是,在需要B时计算B=N×T,其中N是常规的经过平均后的顶点法线。此时,我们的顶点结构体为:

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

回忆一下由GeometryGenerator程序生成的网格计算了对应u轴的切线向量T。对于Grid和Box来说,我们可以直接在每个顶点中指定切线向量T的物体空间坐标(参见图 18.5)。对于Cylinder和Sphere来说,我们可以通过定义向量值函数P(u,v)和计算∂P/∂u来求出每个顶点上的切线向量,其中参数u还被用作为u纹理坐标。

文件下载(已下载 595 次)

发布时间:2014/8/23 19:45:22  阅读次数:3588

2006 - 2024,推荐分辨率1024*768以上,推荐浏览器Chrome、Edge等现代浏览器,截止2021年12月5日的访问次数:1872万9823 站长邮箱

沪ICP备18037240号-1

沪公网安备 31011002002865号