Chcę po prostu mieć pewność, rozumiem obliczenie macierzy TBN poprawnienormalne mapowanie, obliczanie macierzy TBN
W vertex shader zazwyczaj używamy:
vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * Tangent.xyz);
vec3 b = normalize(gl_NormalMatrix * Bitangent.xyz);
mat3 tbn = mat3(t, b, n);
Jak rozumiem to tbn
matryca przekształca wektor od Tangent space do Eye space. Właściwie chcemy odwrócić - przekształcić wektor z przestrzeni oczu na przestrzeń styczną. Zatem musimy odwrócić macierz tbn
:
tbn = transpose(tbn); // transpose should be OK here for doing matrix inversion
uwaga:tbn
- powinna zawierać tylko obroty, za takim przypadku możemy użyć, aby odwrócić transpozycję macierzy.
I możemy przekształcić nasze wektory:
vec3 lightT = tbn * light_vector;
... = tbn * ...
w kilku tutoriali, kody źródłowe Odkryłam, że autorzy zastosowali coś takiego:
light.x = dot(light, t);
light.y = dot(light, b);
light.z = dot(light, n);
Powyższy kod działa tak samo jak pomnożenie przez macierz transposed(tbn)
.
Pytanie:
powinniśmy wykorzystać macierz transponowana tbn
tak jak wyjaśniono powyżej? A może czegoś brakuje?
Uwaga przez tego rozwiązania mamy wektory (light_vector) przekształcić w TBN w vertex shader, potem fragment shader mamy tylko dostać normalny od normalnej mapie. Inną opcją jest utworzenie macierzy TBN, która przekształca się z przestrzeni TBN w przestrzeń oka, a następnie w module cieniującym przekształca każdy odczyt normalny z normalnej mapy.
Zdefiniuj „prawidłowego "? Wziąłeś krzyżówkę swoich normalnych i stycznych wektorów, aby uzyskać wektor bitangencki. Jest to, ogólnie rzecz biorąc, * nie * prawidłowe dla większości powierzchni. Może to być poprawne dla Ciebie, ale większość mapowania tekstur nie używa idealnie odwzorowań ortogonalnych na powierzchni. –
Dobrze, zaktualizowałem pytanie. Zmieniłem także obliczenia bitangenckie. – fen