Я думаю, мы можем вычислить матрицу TBN как в вершинном, так и в фрагментном шейдерах.
// calculate in vs
varying mat3 vTbnMatrix;
void main() {
vec3 n = normalMatrix * aNormal;
vec3 t = normalMatrix * vec3(aTangent.xyz);
vec3 b = cross(n, t) * aTangent.w;
vTbnMatrix = mat3(t, b, n);
}
// calculate in fs
varying vec3 vNormal; // transformed by normalMatrix
varying vec3 vTangent; // transformed by normalMatrix
varying vec3 vBitantent;
void main() {
mat3 tbnMatrix = mat3(vTangent, vBitangent, vNormal);
}
В чем разница?Я думаю, что мы можем вычислить матрицу TBN в вершинном шейдере, поскольку это может ускорить программу.
Но когда я погружаюсь в исходный код THREE.js и движка PlayCanvas, они оба вычисляют матрицу TBN в фрагментном шейдере.
В чем преимущество вычисления в фрагментном шейдере?