Z-buffring

Z-buffring  är ett sätt i 3D -datorgrafik att ta hänsyn till avståndet för ett bildelement . Det är en av lösningarna på "synlighetsproblemet". Mycket effektiv och har praktiskt taget inga nackdelar när den implementeras i hårdvara . Programmatiskt finns det andra metoder som kan konkurrera med det: Z-sort ("artists algoritm") och binär rymdpartitionering (BSP), men de har också sina fördelar och nackdelar. Den största nackdelen med Z-buffring är förbrukningen av en stor mängd minne : den så kallade djupbufferten eller Z-bufferten används i arbetet .

Z-bufferten är en tvådimensionell array , vars varje element motsvarar en pixel på skärmen. När ett grafikkort ritar en pixel beräknas dess avstånd och skrivs till Z-buffertcellen. Om pixlarna för två ritade objekt överlappar varandra, jämförs deras djupvärden, och den som är närmare ritas och dess avståndsvärde lagras i bufferten. Den resulterande grafiska bilden kallas z-depth map , som är en grafisk gråskalebild , vars varje pixel kan ta upp till 256 gråvärden. De bestämmer avståndet från betraktaren av ett objekt i en tredimensionell scen. Kartan används ofta i efterbehandling för att lägga till volym och realism och skapar effekter som skärpedjup , atmosfäriskt dis , etc. Kartan används också i 3D-paket för texturering , vilket gör ytan präglad.

Nedan är resultatet av att använda de två korten tillsammans. Här är den andra kartan hämtad från en scen där den första fungerade som en textur som extruderade ytan.

Karta 1 Karta 2 Resultat

Djupbuffertens bitdjup har en stark effekt på renderingskvaliteten: att använda en 16 -bitars buffert kan leda till geometriska förvrängningar, såsom en "brottningseffekt", om två objekt är nära varandra. 24, 32 bitars buffertar gör sitt jobb bra. 8 bitar används nästan aldrig på grund av låg precision.

Edwin Catmull anses vanligtvis vara uppfinnaren av z-bufferten , även om denna idé beskrevs av Wolfgang Strasser i sin avhandling (1974).

Alternativ

I Z-bufferten i dess klassiska form är buffertens bitrutnät inte tillräckligt exakt på nära avstånd. För att lösa detta problem används en w-buffert , där inte avlägsenhet används, utan dess ömsesidiga ( ). Vilket är bättre att använda - z-buffert eller w-buffert - beror på programmet.

På moderna videoadaptrar tar arbetet med en z-buffert upp en stor del av bandbredden på videoadapterns RAM . För att bekämpa detta används förlustfri komprimering : komprimering/återställning tar mindre resurser än minnesåtkomst.

I början av ramen fylls bufferten med något nummer (till exempel siffran 1.0). Det tar också upp lite maskintid, så det görs ofta så här: den första rambuffringen justeras så att djupet på nära objekt är 0,0 och avlägsna objekt är 0,5. Den andra ramen är från 1,0 till 0,5. Detta minskar precisionen med 1 bit, men eliminerar buffertspolning.

Z-buffert och sortering

Även om Z-bufferten är utformad speciellt för att klara sig utan att sortera synliga ansikten, är hastigheten på Z-bufferten allvarligt beroende av sortering av objekt. Därför måste motorn åtminstone ungefär sortera föremål från långt till nära.

Z-konflikt

Om två objekt har en nära Z-koordinat visas ibland, beroende på synvinkel, det ena, sedan det andra, då visas båda i ett randigt mönster. Detta kallas Z-konflikten ( eng.  Z fighting ). Oftast är konflikter inneboende i specialeffekter (dekaler) som är överlagrade på huvudstrukturen, till exempel kulhål.

Z-konflikter löses genom att flytta ett objekt i förhållande till ett annat med ett värde som överstiger Z-buffertens fel.