天天看点

施密特正交化

有时候我们在某些计算中需要将向量转换到另外一个坐标系下,例如在屏幕环境光遮蔽中(SSAO)我们需要将半球采样核心(hemisphere sample kernel)向量转换到法线所在的切线空间也就是TBN矩阵,法线N我们已经有了,其实在SSAO中B和N向量可以是任意的,只要T,B,N彼此互相垂直即可,所有可以首先随机生成一张噪音图(noise),但是有个问题是我们不能保证噪音图上的随机向量垂直于法线向量,这个时候就是施密特正交化(Gramm-Schmidt Process)大显身手的时候啦。

如图:

施密特正交化

n是法线向量,t是随机向量,现在n和t是不垂直的,我们需要将向量t拉到下面虚线的位置,可以这样做:

t = normalize(t - n * dot(n, t));
           

这个时候t和n就垂直了,然后b向量就很简单了:

vec3 b = cross(n, t);
           

然后就有了我们的TBN矩阵啦

mat3 TBN = mat3(t, b, n);