Calcolo delle normali in WebGL

Mi sono divertito a creare questo esperimento e se ho smanettato bene WebGL, credo non sia possibile far calcolare le normali direttamente al vertex shader, nel caso la mesh 3D modifichi la propria forma (come nel mio esempio). Con il vertex shader puoi accedere solo alla coordinata attualmente in trasformazione e non mi pare esistano barbatrucchi per fare un lookup su altri vertici, operazione necessaria per il calcolo delle normali delle facce. Sono pressochè sicuro esistano vari metodi per “simulare” il calcolo utilizzando texture mapping come base dati, ma è una tecnica che ho deciso di non esplorare per adesso. Probabilmente in WebGL 2 sarà integrato anche un geometry shader dove questo limite verrà superato, o forse no perchè è un qualcosa di particolarmente pesante. Ad ogni modo, far eseguire il calcolo delle normali direttamente alla GPU, invece che alla CPU (anzi a JavaScript che è un compilatore just-in-time di una macchina virtuale), è particolarmente vantaggioso grazie all’elevato grado di parallelizzazione nei calcoli vettoriali.

/DIGRESSIONE MODE=ON

Tra l’altro in WebGL c’è un comportamento piuttosto strano, sembra siano supportate solo le normali sui vertici, non le normali sulle facce. Se un vecchio e povero programmatore come me vuole implementare il flat shading, deve duplicare 3 volte le stesse normali dei relativi 3 vertici del triangolo. Sicuramente le GPU ormai sono talmente ottimizzate per supportare le valanghe di dati che si rallenterebbero col flat shading, un po come le CPU 32-bit/64-bit che diventano lentissime nel manipolare blocchi dati a 8 o 16-bit. Sicuramente OpenGL “desktop” (la versione piena insomma), che consentiva di specificare le normali con la funzione glNormal(), internamente anche lui duplicava i vertici se specificati una sola volta per triangolo … però almeno non mi faceva sentire vecchio! :)

/DIGRESSIONE MODE=OFF

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *