\\ Home : Articoli : Stampa
Depth e Alpha Test
Di RobyDx (del 27/07/2007 @ 15:09:56, in DirectX9, linkato 1556 volte)

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#