\\ Home : Articoli : Stampa
Normal Mapping
Di RobyDx (del 02/08/2007 @ 17:58:51, in Shader Library, linkato 3105 volte)

Il normal mapping è una tecnica ormai di uso comune in computer grafica. La logica dietro è abbastanza semplice. Invece di utilizzare le normali che si trovano nei triangoli, si utilizzano particolari texture (le normal map) i cui colori RGB rappresentano la direzione della normale in quel pixel. In questo modo l'illuminazione non è uniforme in tutto il triangolo ma dipenderà dalla normal map. Un esempio immediato è quello di un muro. Invece di utilizzare migliaia di mattoni si può utilizzare una normal map per simulare il rilievo. Invece di migliaia di mattoni e quindi migliaia di triangoli, basterà un rettangolo con una normal map appropriata per dare un effetto di rilievo (nei limiti ovviamente del possibile).

 

C'è solo un problema. La normal map è una texture che può trovarsi in un punto qualsiasi del modello. Di conseguenza una normal map che darà direzioni verso l'alto, le continuerà a dare sempre verso l'alto anche se orientata verso il basso. La texture infatti non può sapere dove si trova. Di consequenza utilizzare la normale direzione della luce sarebbe errato. Quello che si fa è di trasformare la luce in modo che sia orientata correttamente rispetto alla texture che si troverà in una posizione neutra. Per fare questo si utilizzano 2 vettori speciali: il vettore tangente (come dice la parola tangente alla faccia) e binormale, che forma 90 gradi in ogni direzione tra normale e tangente. Tangente, binormale e normale formano una matrice 3x3. Moltiplicando un vettore per questa matrice lo si trasforma in spazio tangente. Il vettore trasformato può essere usato nel pixel shader per calcolare la luce usando come normale il valore estratto dalla texture. Si può migliorare l'effetto applicando la tecnica nota come parallax, in cui la texture viene spostata di un offset in base alla telecamera ed al valore alpha che viene usato come profondità. Il senso è che più è profonda e più sarà intenso lo spostamento della texture a simulare appunto l'altezza.

Vi lascio al demo