8.8.1. Llum direccional
L’exemple següent mostra dos cubs rotant
mentre una llum direccional els enfoca. Explicarem l’apartat del shader que crea el model d’il·luminació.
Però perquè hi hagi il·luminació també és necessari preparar-la des de fora del
shader. Això es pot anar seguint a
partir del codi font del projecte, el qual està completament comentat. La part
de l’arxiu de shader és la més
ambigua així que en farem una explicació el més completa possible.
El primer que cal fer dins l’arxiu de shader, el qual hem anomenat Effects.fx, és crear l’estructura de la
llum. En aquest hi emmagatzemarem les dades que després usarem al programa
principal. Aquestes són una direcció, la component ambient i la component
difusa de la llum.
A continuació creem els buffer per frame i per objecte de l’escena que
emmagatzemarà les dades i farà d’enllaç amb el programa principal.
Declarem dues variables que usarem a
continuació referents a la textura i al SamplerState de cada objecte.
Texture2D ObjTexture;
SamplerState ObjSamplerState;
A continuació és important veure que cal
incloure la component normal a la sortida del vèrtex shader així com les ja típiques posició i textcoord (degut a les textures que tenen els models). Aquesta
normal ens serveix per calcular quanta quantitat de llum està col·lisionant amb
els models, els cubs.
Després es multiplica les normals dels
objectes amb l’espai de món dels objectes de manera que el càlcul
d’il·luminació sigui correcte. Seria erroni fer la multiplicació amb la matriu
WVP, la de projecció.
Primer
de tot es normalitza la normal del cub, a continuació recuperem la difusa del
cub i l’acumulem en una variable que gravarà el color final (finalColor). Fem el càlcul de la
il·luminació ambient de manera que les parts que no estiguin directament
il·luminades per la llum direccional també siguin visibles a l’escena. Després
calculem el color final de cada píxel un cop hem esbrinat quanta llum està
col·lisionant. La saturació es fa per no sobrepassar valors d’1.0f. Per acabar
retornem el color amb quatre valors, RGB i l’aplha, el qual és el de la textura (diffuse.a).
Aquesta última funció del fitxer fa referencia
al text sobreposat a l’aplicació, i no té a veure amb la il·luminació. Hi és degut
a que es reaprofita el mateix fitxer de shader
per a dues coses diferents.
Figura 1. Il·luminació amb llum direccional.
8.8.2. Llum puntual
Com que l’exemple amb llum puntual es molt similar al de la llum direccional només mostrem la següent imatge i el codi que us podreu descarregar a continuació.
Figura 2. Il·luminació amb llum puntual.
Per a descarregar-se els exemples fes click en aquest enllaç.


No hay comentarios:
Publicar un comentario