目前有很多工具可以直接生成normalmap,不同的工具生成的算法也有点不同,而不同的算法导致tangent和binormal的计算也有点差别。现在大多数的美工最常用的基本上还是3dsmax,用max生成normalmap也是比较常用和方便的方法。不过目前似乎很少有资料提到从max里导出normalmap的时候如何计算tangent向量,max的文档和例子说这个东西的时候也是遮遮掩掩的,相信很多人都在计算这个东西的时候遇到点点麻烦,导致显示只能“近似正确”。正确的计算方法应该按照下面这个步骤:
    首先根据每个面的三个顶点坐标和uv坐标正常计算出每个面的tangent,binormal和normal。
然后max生成normalmap的时候是根据如果一个点在某些面上“平滑”过渡,这个点的切线才能由这些面叠加。对normalmap来说一个点在两个面之间“平滑”过渡有3个必要条件:
    第一两个面的smoothgroup必须相等,也就是说共用这个点的两个邻面的smoothgroup必须相等(如果模型在max里没有给定smoothgroup,则认为是单独的一组smoothgroup,如果有多组,则每组都应该考虑,但叠加向量的时候每个面只能计算一次)。
    二是两个面在这一点的UV必须连续,也就是说这两个面在这一点的UV相等,因为max的数据结构是按面来索引不同的顶点和UV,所以同一个点UV有时候不相同,如果UV不同,normalmap在这里并不连续。
    三是UV的方向必须一致,两个面之间的UV必须同为正向或同为反向。因为tangent,binormal各表示贴图的u方向和v方向,而normal只决定于smoothgroup,所以我们可以用两个面的tangent,binormal和normal三个向量组成的行列式的值是否同号来判断方向是否一致。
    如果一个点所被包含的某些面相邻,并且满足以上三个条件,那么这个点的tangent向量就必须由这些面的tangent向量叠加(normal只需要满足smoothgroup相等),否则不能叠加。
  
  很显然,由于normal与tangent和binormal的条件不一样,大多数情况下计算之后会多生成一些顶点。