Voglio solo essere sicuro di aver capito TBN calcolo matriciale correttamentenormal mapping, TBN calcolo matriciale
In vertex shader siamo soliti usare:
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);
quanto ho capito questa matrice tbn
trasforma un vettore da Tangente spazio a Eye spazio. In realtà vogliamo il contrario: trasformare un vettore dallo spazio dell'occhio allo spazio tangente. Così abbiamo bisogno di invertire la matrice tbn
:
tbn = transpose(tbn); // transpose should be OK here for doing matrix inversion
nota:tbn
- dovrebbe contenere soltanto le rotazioni, per questo caso possiamo usare trasposizione di invertire la matrice.
E possiamo trasformare i nostri vettori:
vec3 lightT = tbn * light_vector;
... = tbn * ...
In diversi tutorial, codici sorgente Ho scoperto che autori hanno usato qualcosa di simile:
light.x = dot(light, t);
light.y = dot(light, b);
light.z = dot(light, n);
Il codice di cui sopra fa lo stesso di moltiplicare dalla matrice transposed(tbn)
.
La domanda:
Dovremmo usare trasposta tbn
matrice proprio come ho spiegato sopra? O forse mi manca qualcosa?
Nota con tale soluzione abbiamo vettori (light_vector) trasformati in TBN nel vertex shader, quindi in framment shader dobbiamo solo normalizzarci dalla normale mappa. Un'altra opzione è creare una matrice TBN che si trasformi dallo spazio TBN nello spazio dell'occhio e quindi nello shader del frammento trasformare ogni normale normale dalla mappa normale.
Definire "corretta "? Hai preso il prodotto incrociato dei tuoi vettori normali e tangenti per ottenere il tuo vettore bitangent. Questo è, generalmente parlando, * non * corretto per la maggior parte delle superfici. Potrebbe essere corretto per il tuo, ma la maggior parte della mappatura della trama non usa mappature perfettamente ortogonali alla superficie. –
Giusto, ho aggiornato la domanda. Ho anche cambiato il calcolo dei bitangent. – fen