Dela via


Djupbuffertar (Direct3D 9)

En djupbuffert, som ofta kallas z-buffert eller w-buffert, är en egenskap för den enhet som lagrar djupinformation som ska användas av Direct3D. När Direct3D renderar en scen till en målyta kan den använda minnet på en associerad djupbuffertyta som en arbetsyta för att avgöra hur bildpunkterna i rastrerade polygoner occlude varandra. Direct3D använder en Direct3D-yta utanför skärmen som mål som de slutliga färgvärdena skrivs till. Djupbuffertytan som är associerad med render-målytan används för att lagra djupinformation som talar om för Direct3D hur djupt varje synlig pixel finns i scenen.

När en scen rastreras med djupbuffertning aktiverad testas varje punkt på återgivningsytan. Värdena i djupbufferten kan vara en punkts z-koordinat eller dess homogena w-koordinat – från punktens (x,y,z,w) plats i projektionsutrymmet. En djupbuffert som använder z-värden kallas ofta för en z-buffert, och en som använder w-värden kallas för en w-buffert. Varje typ av djupbuffert har fördelar och nackdelar, som beskrivs senare.

I början av testet anges djupvärdet i djupbufferten till det största möjliga värdet för scenen. Färgvärdet på återgivningsytan är inställt på antingen bakgrundsfärgvärdet eller färgvärdet för bakgrundsstrukturen vid den tidpunkten. Varje polygon i scenen testas för att se om den korsar den aktuella koordinaten (x,y) på återgivningsytan. Om det gör det testas djupvärdet – som kommer att vara z-koordinaten i en z-buffert och w-koordinaten i en w-buffert – vid den aktuella punkten för att se om det är mindre än djupvärdet som lagras i djupbufferten. Om polygonvärdets djup är mindre lagras det i djupbufferten och färgvärdet från polygonen skrivs till den aktuella punkten på återgivningsytan. Om djupvärdet för polygonen vid den tidpunkten är större testas nästa polygon i listan. Den här processen visas i följande diagram.

diagram över testdjupvärden

Not

Även om de flesta program inte använder den här funktionen kan du ändra jämförelsen som Direct3D använder för att avgöra vilka värden som placeras i djupbufferten och därefter återgivningsmålytan. Om du vill göra det ändrar du värdet för D3DRS_ZFUNC återgivningstillstånd. Om du ändrar jämförelsefunktionen på viss maskinvara kan du inaktivera hierarkisk z-testning.

 

Nästan alla acceleratorer på marknaden stöder z-buffring, vilket gör z-buffertar till den vanligaste typen av djupbuffert idag. Men allestädes närvarande, z-buffertar har sina nackdelar. På grund av matematiken tenderar de genererade z-värdena i en z-buffert att inte fördelas jämnt över z-buffertintervallet (vanligtvis 0,0 till 1,0, inklusive). Mer specifikt påverkar förhållandet mellan de avlägsna och nära urklippsplan starkt hur ojämnt z-värden fördelas. Med ett avstånd mellan långt och nära plan på 100 används 90 procent av djupbuffertintervallet på de första 10 procenten av scenens djupintervall. Typiska program för underhållning eller visuella simuleringar med exteriörscener kräver ofta förhållande mellan långt plan och nära plan var som helst mellan 1 000 och 10 000. Med ett förhållande på 1 000 spenderas 98 procent av intervallet på de första 2 procenten av djupintervallet, och fördelningen blir sämre med högre förhållanden. Detta kan orsaka dolda ytartefakter i avlägsna objekt, särskilt när du använder 16-bitars djupbuffertar, det vanligaste bitdjupet som stöds.

En w-baserad djupbuffert, å andra sidan, är ofta jämnare fördelad mellan de nära och fjärran klippplan än en z-buffert. Den viktigaste fördelen är att förhållandet mellan avstånd för de avlägsna och nära klippplan inte längre är ett problem. Detta gör det möjligt för program att stödja stora maximala intervall, samtidigt som de får relativt exakt djupbuffertning nära ögonpunkten. En w-baserad djupbuffert är inte perfekt och kan ibland visa dolda ytartefakter för nära objekt. En annan nackdel med den w-buffrade metoden är relaterad till maskinvarustöd: w-buffring stöds inte lika mycket i maskinvara som z-buffring.

Att använda en z-buffert kräver omkostnader under återgivningen. Olika tekniker kan användas för att optimera renderingen när du använder z-buffertar. Mer information finns i Z-Buffer Performance.

Not

Den faktiska tolkningen av ett djupvärde är specifik för renderaren.

 

Det här avsnittet innehåller information om hur du använder djupbuffertar för borttagning av dolda linjer och dolda ytor.

Direct3D-återgivning