Come per lo stencil buffer anche lo ZBuffer presenta caratteristiche impostabili per ottimizzare e migliorare il calcolo delle profondità in DirectX. Le possibilità offerte da semplici manipolazioni possono risolvere infatti numerosi problemi offrendo ad esempio la possibilità di modificare la sensazione di profondità di una scena. Ora analizzeremo lo ZBuffer per poi passare all'AlphaTest.
ZBuffer
Lo ZBuffer funziona in questo modo.
Al normale backbuffer come sappiamo è associata una superficie della stessa dimensione che chiamiamo Zbuffer. Ogni volta che un oggetto 3D viene renderizzato sullo schermo viene calcolata per ogni pixel la sua posizione in profondità e confrontata con lo ZBuffer. Se il valore è minore il pixel viene inserito sullo schermo e lo ZBuffer aggiornato al valore della nuova profondità, in caso contrario il pixel non viene renderizzato e lo ZBuffer mantiene il suo valore. Questo è lo ZBuffer, una funzione che tramite la sua superficie memorizza la massima profondità e la confronta con quelle dei pixel da disegnare per decidere se accettare il pixel o meno. Questo è il funzionamento di default che possiamo personalizzare.
Attivare o disattivare lo ZBuffer
device.RenderState.ZBufferEnable = True per disattivare lo Z
In questo modo l'oggetto verrà renderizzato sempre sullo schermo senza mai modificare il Buffer.
device.RenderState.ZBufferEnable = False per attivare
Questo è il funzionamento di default
Attivare o disattivare la scrittura
device.RenderState.ZBufferWriteEnable=True
Questo è il funzionamento di default, l'oggetto rispetta la profondità e aggiorna lo ZBuffer quando serve.
device.RenderState.ZBufferWriteEnable=False
L'oggetto rispetta la profondità e ma non aggiorna lo ZBuffer. Quindi oggetti renderizzati appariranno sempre davanti l'oggetto, anche se si trovano dietro.
Complementarietà
device.RenderState.DepthBias = n
Questa funzione permette di assegnare una precedenza per pixel alla stessa profondità. Quando 2 oggetti sono alla stessa profondità può capitare che alcune parti di esso passi avanti e altre no. Impostando prima il Bias potrete dare una priorità. Valori superiori si troveranno avanti in questi casi. Il valore n varia da 0 a 16.
Funzione di Z
tramite l'istruzione potrete decidere quale è la funzione da rispettare per far passare al pixel il test (ossia essere visibile). Se writeenable è impostata ad 1 viene anche aggiornato il valore del buffer.
device.RenderState.ZBufferFunction = compare.funzione
Le funzioni sono le seguenti
Never = il pixel non passa mai il test
Less = il pixel passa solo se minore dei precedenti valori
Equal = il pixel passa solo se uguale ai precedenti valori
LessEqual = default, il pixel passa solo se minore o uguale ai precedenti valori
Greater = il pixel passa solo se maggiore dei precedenti valori
NotEqual = il pixel passa solo se diverso dai precedenti valori
GreaterEqual = il pixel passa solo se maggiore o uguale ai precedenti valori
Always =il pixel passa sempre il test
AlphaTest
Molte persone non sono mai riuscite ad utilizzare i valori di alpha di texture e materiali. Caricate su un modello una texture con colore trasparente ed attivate l'alphatest tramite istruzioni
device.RenderState.AlphaTestEnable = True
Ora potete già osservare il funzionamento delle texture. Tramite l'istruzione
device.RenderState.AlphaFunction=Compare. funzione
potete impostare quali pixel debbano comparire o no a secondo del loro valore. I valori impostati con colore trasparente sono uguali a 0 mentre 1 i rimanenti. Quindi se impostate il rosso come colore trasparente questo sarà quindi 1,0,0,0 mentre il verde sarà invece 0,1,0,1. I valori vengono comparati tramite la funzione impostata in alphafunc. Le opzioni sono le stesse dello ZBuffer ma il default è always
Never = il pixel non passa mai il test
Less = il pixel passa solo se minore dei precedenti valori
Equal = il pixel passa solo se uguale ai precedenti valori
LessEqual = il pixel passa solo se minore o uguale ai precedenti valori
Greater = il pixel passa solo se maggiore dei precedenti valori
NotEqual = il pixel passa solo se diverso dai precedenti valori
GreaterEqual = il pixel passa solo se maggiore o uguale ai precedenti valori
Always =default, il pixel passa sempre il test
Il valore viene confrontato con il valore inserito nel riferimento
device.RenderState.ReferenceAlpha=n
il valore varia tra 0 e 255. Quindi se mettete la funzione a equal e ref a 255 il colore impostato come colore trasparente sparirà e sarà visibile quello non impostato. Al contrario con ref uguale a 0 comparirà il colore trasparente. La trasparenza della texture porterà via anche il materiale sottostante e quindi praticamente bucherete il materiale (se ad esempio vorrete fare un cancello dovrete usare l'alphaTest).
Esempio C#