一、法线的空间变换原理(源于Shader入门精要中介绍:)
由此得到三个重要公式:
1、如果要对法线做空间转换,需要法线向量右乘矩阵的逆转置矩阵。
2、如果是正交矩阵,则直接右乘转换矩阵:NB=MA->BNA
(注:正交矩阵M定义是MTM=I,即M的各行向量为相互垂直的单位向量,各列向量也是互相垂直的单位向量)
3、如果不是正交矩阵,但是统一缩放矩阵,则可以直接右乘转换矩阵和缩放系数的倒数:NB=(MA->BNA)/k
二、关于利用切线空间TBN进行法线转换:
假设已知切线空间TBN,切线空间的法线Nt,计算世界空间下的法线Nw?
Nw = TBN * Nt = Nt * TBNt;
Ps1:Unity/Unreal用的是列矩阵,所以float3x3(T,B,N)所构造的是其实是TBNt,所以要用右乘。
Ps2:不清楚是行主还是列主矩阵的引擎,Nw = float3(T * Nt.x, B * Nt.y, N * Nt.z)总是没错的。