8.8. Exemples

Els dos exemples que acompanyen aquest capítol mostren una escena amb dos cubs , un punt de llum i un text sobreposat a l’escena 3D. Aquests cubs són il·luminats gràcies a una llum direccional en el primer exemple i una llum puntual en el segon exemple. El text sobreposat representa els frames per segon de l’escena. A continuació s’explicarà el primer exemple. El segon és una evolució lògica del primer el qual pot entendre’s seguint el codi font adjunt.


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