En computación gráfica, el z-buffering es la parte de la memoria de un adaptador de video encargada de gestionar las coordenadas de profundidad de las imágenes en los gráficos en tres dimensiones (3-D), normalmente calculados por hardware y algunas veces por software.
El Z-buffering también se conoce como buffering de profundidad, debido a que la profundidad del píxel generado (coordenada z) al ser dibujado por una tarjeta gráfica 3D, se almacena en un búfer de datos (el z-buffer).
La invención del concepto de z-buffer se le suele asignar a Edwin Catmull. Realmente también Wolfgang Straßer describió esta idea en su tesis doctoral de 1974 [2]
Este búfer se suele distribuir como un array de 2 dimensiones (x-y) con un elemento por cada pixel de la pantalla. Si algún otro objeto de la escena se tiene que renderizar en el mismo pixel, la tarjeta gráfica compara las dos profundidades y elige el más cercano al observador. La profundidad elegida es entonces salvada en el z-buffer, reemplazando a la antigua. Al final, el z-buffer permitirá a la tarjeta gráfica reproducir correctamente la percepción de la profundidad normal: los objetos cercanos ocultan a los más lejanos. Este efecto se denomina Z-Culling. [1]
Es utilizado en casi todas las computadoras, ordenadores portátiles y teléfonos móviles actuales para realizar gráficos en 3D, por ejemplo, para juegos de ordenador. El buffer Z se implementa en los ICs de silicio (circuitos integrados) dentro de estos ordenadores. El Z-buffer también se utiliza (implementado como software en lugar de hardware) para producir efectos especiales generados por ordenador para películas.
Además, los datos del buffer Z obtenidos desde un punto de luz permiten la creación de sombras mediante la técnica de mapeo de sombras.[2]
Este algoritmo está implementado en la mayoría de tarjetas gráficas y forma parte de las técnicas utilizadas por las bibliotecas gráficas (opengl, DirectX)[3]
En el algoritmo se crea una matriz que contiene los valores z de la superficie visible para cada pixel representando la distancia en z hacia el observador, esta matriz es llamada z buffer. Los valores iniciales de esta matriz se establecen como infinito. Una vez asignados los valores se procede a iterar sobre los polígonos que compongan la escena, por cada uno de los cuales se iterará sobre cada uno de sus pixeles; finalmente para cada pixel se calculará la distancia en z hacia la camara. Una vez obtenida las posiciones en x e y del pixel actualizaremos el z buffer bajo el siguiente criterio:
Suponga por ejemplo que tenemos la escena compuesta por las figuras de la siguiente imagen (izquierda).
El algoritmo funciona creando una matriz bidimensional donde cada entrada
explicar
clear frame buffer viewport to background color
clear depth buffer zbuffer to 1.0
for each polygon P
for each pixel (xndc, yndc) to which P projects
if zndc < zbuffer[xndc, yndc] then
zbuffer[xndc, yndc] := zndc
viewport[xndc, yndc] := color of P at (xndc, yndc)
endif
endfor
endfor
Debe tener en cuenta que necesita un buffer con el mismo ancho/altura que la ventana de visualización. La memoria real utilizada sería la anchura! altura! sizeof (real). En estos días, sizeof (real) es de alrededor de 4 a 8 bytes - más grande que un píxel RGB típico Por lo tanto, una implementación de z-buffer inmediatamente requiere al menos tres veces la visualización deseada
.
Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.
Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.