今天终于做了个凹凸映射,前段时间又耍了不少,罪过啊。。。由于电子书上居然少了关键的一页,只好把推导记录在这个地方,顺便总结一下,也算是加深印象。
法线图的构造是从高度图中提取每个像素的高度,对每个像素的法向量,要计算U,V方向上的切向量,这两个切向量依赖于这个像素的相邻的两个像素的高度差,最后法向量等于这两个切向量的叉乘。由于法向量存储在纹理中,所以需要将值转换到0,255范围内。
凹凸映射的光照计算需要在切线空间(tangent space)中进行,所以需要将光线向量从模型空间(object space)转换到切线空间,以下是切线空间的构造方法:
我们需要的切线空间,它的X轴与贴到三角形上的纹理的U轴平行,它的Y轴与V轴平行。
假设向量T,B就是满足上面条件的两个向量,那么对于三角形内任意一点Q,都有:
Q − P0 = (u − u0)T + (v − v0)B,
P0是三角形的任意顶点,u0,v0是这个顶点的纹理坐标,u,v是Q点的纹理坐标。 这里相当于用T,B两个基向量来表示任一向量。
假设我们知道三角形三个顶点分别为 P0, P1, P2, 相应的纹理坐标为 (u0, v0), (u1, v1), (u2, v2),这样计算可以更简单,有以下等式:
Q1 = P1 − P0
Q2 = P2 − P0
这是三角形顶点构成的两个向量
(s1, t1) = (u1 − u0, v1 − v0)
(s2, t2) = (u2 − u0, v2 − v0).
这是纹理坐标构成的两个向量,我们需要的就是把Q1 Q2变换到纹理空间上去,于是有以下等式
Q 2 = s 2 T + t 2 B
Tx Ty Tz | Bx By Bz | Nx Ny Nz | . |
B′ = B − (N · B)N − (T′ · B)T′
T′x B′x Nx | T′y B′y Ny | T′z B′z Nz |
