Algoritmos de HSR

Z-buffering

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]


Características

  • Uno de los algoritmos más simples y más usados
  • Fácilmente implementado a nivel de hardware
  • Trabaja basado en la imagen

Usos e implementaciones

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]


Algoritmo Z-buffer

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:

  1. Si el valor en z para el pixel actual es menor que el valor del z buffer (i.e el objeto en cuestión se encuentra más cerca a la camara) reemplazamos el valor de ese pixel en el z buffer por el valor en el pixel del polígono actual.
  2. En caso de que el valor en el z buffer sea menor (i.e el objeto se encuentra más lejos que otro objeto ya visto) no modificaremos la matriz.

Suponga por ejemplo que tenemos la escena compuesta por las figuras de la siguiente imagen (izquierda), enmarcadas como se muestra por el cuadrado de borde negro.

Las matrices superiores el proceso de buffer de la figura gris, como se puede al ser la primera figura se añade completamente pues no existe ninguna figura más cercana en esos pixeles.

Las matrices inferiores muestran la inclusión de la figura amarilla como se puede observar, algunos de los pixeles tiene una distancia mayor a la ya registrada en el z buffer, por lo que son ignorados


Pseudocódigo


            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
            

Notas de implementación

  • Puede pintar el mismo pixel varias veces[3]
  • Se puede pintar el inverso de la escena
  • Requiere de una capacidad de memora bastante grande

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


Ventajas y Desventajas

Dentro de las ventajas y desventajas de este algoritmo se encuentran

Ventajas

  • El depth buffering se realiza de manera rápida, pues depende directamente del número de polígonos y el número de pixeles que componen la escena.
  • Actualmente su eficiencia ha llevado este algoritmo a ser ampliamente usado por actores tan relevantes como OpenGl o Nvidia.

Desventajas

  • Alto consumo de memoria, pues es necesario guardar el tamaño completo de la camara en pixeles, debido a esto en sus origenes este algoritmo fue descartado pues en ese entonces las capacidades de recursos de los computadores eran bastante limitados.
  • Frente a escenas con objetos transparentes ofrece poca o ninguna mejora respecto a eficiencia en el depth buffering.

Referencias y Bibliografía

  • [1] https://en.wikipedia.org/wiki/Z-buffering
  • [2] https://es.wikipedia.org/wiki/Z-buffer
  • [3] http://slideplayer.es/slide/4009190/
  • [4] http://myweb.lmu.edu/dondi/share/cg/hsr-v02.pdf
  • [5] http://webserver2.tecgraf.puc-rio.br/~abraposo/INF1366/2004/11_HiddenSurfaces.pdf