Z-buffering er en måde i 3D computergrafik at tage højde for afstanden af et billedelement . Det er en af løsningerne på "problemet med synlighed". Meget effektiv og har stort set ingen ulemper, når den implementeres i hardware . Programmatisk er der andre metoder, der kan konkurrere med det: Z-sort ("kunstnerens algoritme") og binær rumpartitionering (BSP), men de har også deres fordele og ulemper. Den største ulempe ved Z-buffer er forbruget af en stor mængde hukommelse : den såkaldte dybdebuffer eller Z-buffer bruges i arbejdet .
Z-bufferen er et todimensionelt array , hvor hvert element svarer til en pixel på skærmen. Når et videokort tegner en pixel, beregnes dens afstand og skrives til Z-buffercellen. Hvis pixels på to tegnede objekter overlapper hinanden, sammenlignes deres dybdeværdier, og den, der er tættere på, tegnes, og dens afstandsværdi gemmes i bufferen. Det resulterende grafiske billede kaldes z-depth map , som er et grafisk gråtonebillede , hvor hver pixel kan tage op til 256 gråværdier. De bestemmer afstanden fra beskueren af et objekt i en tredimensionel scene. Kortet er meget brugt i efterbehandling for at tilføje volumen og realisme og skaber effekter som dybdeskarphed , atmosfærisk dis osv. Kortet bruges også i 3D-pakker til teksturering , hvilket gør overfladen præget.
Nedenfor er resultatet af at bruge de to kort sammen. Her er det andet kort taget fra en scene, hvor det første fungerede som en tekstur, der ekstruderede overfladen.
Kort 1 | Kort 2 | Resultat |
Bitdybden af dybdebufferen har en stærk effekt på gengivelseskvaliteten: Brug af en 16- bit buffer kan føre til geometriske forvrængninger, såsom en "wrestling"-effekt, hvis to objekter er tæt på hinanden. 24, 32 bit buffere gør deres arbejde godt. 8 bits bliver næsten aldrig brugt på grund af lav præcision.
Edwin Catmull betragtes normalt som opfinderen af z-bufferen , selvom denne idé blev beskrevet af Wolfgang Strasser i sin afhandling (1974).
I Z-bufferen i dens klassiske form er bufferens bitgitter ikke tilstrækkelig nøjagtigt på tætte afstande. For at løse dette problem bruges en w-buffer , hvor der ikke bruges fjernhed, men dens gensidige ( ). Hvilken er bedre at bruge - z-buffer eller w-buffer - afhænger af programmet.
På moderne videoadaptere optager arbejdet med en z-buffer en stor del af båndbredden af videoadapterens RAM . For at bekæmpe dette bruges tabsfri komprimering : komprimering/gendannelse tager færre ressourcer end hukommelsesadgang.
I begyndelsen af rammen er bufferen fyldt med et eller andet tal (f.eks. tallet 1.0). Det tager også noget maskintid, så det gøres ofte på denne måde: den første rammebuffring justeres, så dybden af nære objekter er 0,0, og fjerne objekter er 0,5. Den anden ramme er fra 1,0 til 0,5. Dette reducerer præcisionen med 1 bit, men eliminerer bufferskylning.
Selvom Z-bufferen er designet specifikt til at undvære at sortere synlige ansigter, er Z-bufferens hastighed alvorligt afhængig af sortering af objekter. Derfor skal motoren i hvert fald tilnærmelsesvis sortere genstande fra fjern til nær.
Hvis to objekter har en tæt Z-koordinat, vises nogle gange, afhængigt af synspunktet, den ene og derefter den anden, så vises begge i et stribet mønster. Dette kaldes Z-konflikten ( eng. Z fighting ). Oftest er konflikter iboende i specialeffekter (decals), der er overlejret på hovedteksturen, for eksempel skudhuller.
Z-konflikter løses ved at flytte et objekt i forhold til et andet med en værdi, der overstiger Z-bufferens fejl.