Condividi tramite


Distorsione profondità (Direct3D 9)

I poligoni coplanari nello spazio 3D possono essere visualizzati come se non siano coplanari aggiungendo una distorsione z a ognuno di essi. Si tratta di una tecnica comunemente usata per garantire che le ombreggiature in una scena vengano visualizzate correttamente. Ad esempio, un'ombreggiatura su una parete avrà probabilmente lo stesso valore di profondità del muro. Se si esegue prima il rendering del muro e quindi l'ombreggiatura, l'ombreggiatura potrebbe non essere visibile o gli artefatti di profondità potrebbero essere visibili. È possibile invertire l'ordine in cui si esegue il rendering degli oggetti coplanari sperando di invertire l'effetto, ma gli artefatti di profondità sono ancora probabili.

Un'applicazione può garantire che il rendering dei poligoni coplanari venga eseguito correttamente aggiungendo una distorsione ai valori z usati dal sistema durante il rendering dei set di poligoni coplanari. Per aggiungere una distorsione z a un set di poligoni, chiamare il metodo IDirect3DDevice9::SetRenderState appena prima di eseguirne il rendering, impostando il parametro State su D3DRS_DEPTHBIAS e il parametro Value su un valore float appropriato (ad esempio, un valore appropriato potrebbe essere compreso tra -1,0 e 1,0); per passare questo valore a SetRenderState, è anche necessario eseguire il cast del valore in un DWORD. Un valore z-bias superiore aumenta la probabilità che i poligoni di cui si esegue il rendering saranno visibili quando vengono visualizzati con altri poligoni coplanari.

Offset = m * D3DRS_SLOPESCALEDEPTHBIAS + D3DRS_DEPTHBIAS

dove m è la pendenza massima della profondità del triangolo di cui viene eseguito il rendering.

m = max(abs(delta z / delta x), abs(delta z / delta y)) 

Le unità per il D3DRS_DEPTHBIAS e D3DRS_SLOPESCALEDEPTHBIAS stati di rendering dipendono dal fatto che sia abilitato z-buffering o w-buffering. L'applicazione deve fornire valori appropriati.

La distorsione non viene applicata ad alcuna primitiva linea e punto. Tuttavia, questa distorsione deve essere applicata ai triangoli disegnati in modalità wireframe.

// RenderStates
D3DRS_SLOPESCALEDEPTHBIAS, // Defaults to zero
D3DRS_DEPTHBIAS,           // Defaults to zero
// Caps
D3DPRASTERCAPS_DEPTHBIAS           
D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS 

Pixel Pipeline