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 下午7:45:22 阅读次数:4170