Z-buffering este o modalitate în grafica computerizată 3D de a lua în considerare distanța unui element de imagine . Este una dintre soluțiile la „problema vizibilității”. Foarte eficient și practic nu are dezavantaje atunci când este implementat în hardware . Din punct de vedere programatic, există și alte metode care pot concura cu el: Z-sort ("algoritmul artistului") și partiționarea spațiului binar (BSP), dar au și avantajele și dezavantajele lor. Principalul dezavantaj al Z-buffering este consumul unei cantități mari de memorie : așa-numitul buffer de adâncime sau Z-buffer este utilizat în lucrare .
Z-buffer-ul este o matrice bidimensională , fiecare element corespunde unui pixel de pe ecran. Când o placă video desenează un pixel, distanța acestuia este calculată și scrisă în celula Z-buffer. Dacă pixelii a două obiecte desenate se suprapun, atunci valorile lor de adâncime sunt comparate, iar cel care este mai aproape este desenat, iar valoarea distanței sale este stocată în buffer. Imaginea grafică rezultată se numește hartă z-depth , care este o imagine grafică în tonuri de gri , fiecare pixel din care poate lua până la 256 de valori de gri. Ele determină distanța față de privitor a unui obiect dintr-o scenă tridimensională. Harta este utilizată pe scară largă în post-procesare pentru a adăuga volum și realism și creează efecte precum adâncimea câmpului , ceața atmosferică etc. Harta este folosită și în pachete 3D pentru texturare , făcând suprafața în relief.
Mai jos este rezultatul utilizării celor două cărți împreună. Aici a doua hartă este preluată dintr-o scenă în care prima a acționat ca o textură care extruda suprafața.
Harta 1 | Harta 2 | Rezultat |
Adâncimea de biți a tamponului de adâncime are un efect puternic asupra calității redării: utilizarea unui tampon de 16 biți poate duce la distorsiuni geometrice, cum ar fi un efect de „luptă”, dacă două obiecte sunt aproape unul de celălalt. Bufferele pe 24, 32 de biți își fac treaba bine. 8 biți nu sunt aproape niciodată utilizați din cauza preciziei scăzute.
Edwin Catmull este de obicei considerat inventatorul z-buffer , deși această idee a fost descrisă de Wolfgang Strasser în disertația sa (1974).
În Z-buffer în forma sa clasică, grila de biți a tamponului nu este suficient de precisă la distanțe apropiate. Pentru a rezolva această problemă, se folosește un buffer w , în care nu se folosește distanța, ci reciproca ( ). Care este mai bine de utilizat - z-buffer sau w-buffer - depinde de program.
Pe adaptoarele video moderne, lucrul cu un buffer z ocupă o mare parte din lățimea de bandă a memoriei RAM a adaptorului video . Pentru a combate acest lucru, se utilizează compresia fără pierderi : compresia/recuperarea necesită mai puține resurse decât accesul la memorie.
La începutul cadrului, tamponul este umplut cu un număr (de exemplu, numărul 1.0). De asemenea, ocupă ceva timp mașinii, așa că deseori se face astfel: primul cadru tampon este ajustat astfel încât adâncimea obiectelor apropiate să fie 0,0, iar obiectele îndepărtate să fie 0,5. Al doilea cadru este de la 1,0 la 0,5. Acest lucru reduce precizia cu 1 bit, dar elimină spălarea tamponului.
Deși Z-buffer este proiectat special pentru a face fără sortarea fețelor vizibile, viteza Z-buffer depinde în mod serios de sortarea obiectelor. Prin urmare, motorul trebuie să sorteze cel puțin aproximativ obiectele de la departe la aproape.
Dacă două obiecte au o coordonată Z apropiată, uneori, în funcție de punctul de vedere, unul este afișat, apoi celălalt, atunci ambele sunt afișate într-un model în dungi. Acesta se numește conflictul Z ( ing. Z fighting ). Cel mai adesea, conflictele sunt inerente efectelor speciale (decalcomanii) care sunt suprapuse pe textura principală, de exemplu, găurile de gloanțe.
Conflictele Z sunt rezolvate prin deplasarea unui obiect față de altul cu o valoare care depășește eroarea tamponului Z.