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).

El algoritmo funciona creando una matriz bidimensional donde cada entrada

explicar

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

.

Uso de Z-buffer en OpenGl

Comparación de algoritmos de HSR

Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.

  1. Vestibulum id ligula porta felis euismod semper.
  2. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
  3. Maecenas sed diam eget risus varius blandit sit amet non magna.

Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.


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