Dela via


Djupförskjutning (Direct3D 9)

Polygoner som är coplanar i ditt 3D-utrymme kan göras så att de ser ut som om de inte är coplanar genom att lägga till en z-bias till var och en. Det här är en teknik som ofta används för att säkerställa att skuggor i en scen visas korrekt. Till exempel kommer en skugga på en vägg sannolikt att ha samma djupvärde som väggen gör. Om du renderar väggen först och sedan skuggan kanske skuggan inte är synlig, eller så kan djupartefakter vara synliga. Du kan ändra i vilken ordning du återger de coplanariska objekten i hopp om att ändra effekten, men djupartefakter är fortfarande sannolika.

Ett program kan hjälpa till att säkerställa att coplanarpolygoner återges korrekt genom att lägga till en bias till de z-värden som systemet använder när de återger uppsättningarna med coplanarpolygoner. Om du vill lägga till en z-bias i en uppsättning polygoner anropar du metoden IDirect3DDevice9::SetRenderState precis innan du återger dem, anger parametern State till D3DRS_DEPTHBIAS och parametern Value till ett lämpligt flyttalvärde (till exempel kan ett lämpligt värde vara från -1,0 till 1,0); om du vill skicka det här värdet till SetRenderStatemåste du också omvandla värdet till en DWORD-. Ett högre z-bias-värde ökar sannolikheten för att polygonerna du renderar visas när de visas med andra coplanarpolygoner.

Offset = m * D3DRS_SLOPESCALEDEPTHBIAS + D3DRS_DEPTHBIAS

där m är den maximala djuplutningen för triangeln som återges.

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

Enheterna för D3DRS_DEPTHBIAS- och D3DRS_SLOPESCALEDEPTHBIAS återgivningstillstånd beror på om z-buffring eller w-buffring är aktiverat. Programmet måste ange lämpliga värden.

Bias tillämpas inte på någon linje och punkt primitiv. Den här biasen måste dock tillämpas på trianglar som ritas i trådramsläge.

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

Pixel Pipeline