Almacenamiento en búfer Z - Z-buffering

Datos del búfer Z

Un búfer de profundidad , también conocido como búfer z , es un tipo de búfer de datos utilizado en gráficos por computadora para representar información de profundidad de objetos en el espacio 3D desde una perspectiva particular . Los búferes de profundidad son una ayuda para renderizar una escena para garantizar que los polígonos correctos ocluyan correctamente otros polígonos. El almacenamiento en búfer Z fue descrito por primera vez en 1974 por Wolfgang Straßer en su tesis doctoral sobre algoritmos rápidos para renderizar objetos ocluidos. Una solución similar para determinar polígonos superpuestos es el algoritmo del pintor , que es capaz de manejar elementos de escena no opacos, aunque a costa de la eficiencia y los resultados incorrectos.

En una canalización de renderizado 3D , cuando se proyecta un objeto en la pantalla, la profundidad (valor z) de un fragmento generado en la imagen de pantalla proyectada se compara con el valor ya almacenado en el búfer ( prueba de profundidad ) y lo reemplaza si el nuevo valor está más cerca. Funciona en conjunto con el rasterizador , que calcula los valores coloreados. El fragmento generado por el rasterizador se guarda si no está superpuesto por otro fragmento.

Al ver una imagen que contiene objetos o superficies opacas que se superponen parcial o totalmente, no es posible ver completamente los objetos que están más lejos del espectador y detrás de otros objetos (es decir, algunas superficies están ocultas detrás de otras). Si no hubiera un mecanismo para administrar las superficies superpuestas, las superficies se renderizarían una encima de la otra, sin importar si están destinadas a estar detrás de otros objetos. La identificación y eliminación de estas superficies se denomina problema de superficie oculta . Para comprobar la superposición, la computadora calcula el valor z de un píxel correspondiente al primer objeto y lo compara con el valor z en la misma ubicación de píxel en el búfer z. Si el valor z calculado es menor que el valor z que ya está en el búfer z (es decir, el nuevo píxel está más cerca), entonces el valor z actual en el búfer z se reemplaza con el valor calculado. Esto se repite para todos los objetos y superficies de la escena (a menudo en paralelo ). Al final, el z-buffer permitirá una reproducción correcta de la percepción de profundidad habitual: un objeto cercano esconde otro más alejado. Esto se llama descarte z .

El búfer z tiene la misma estructura de datos interna que una imagen, es decir, una matriz 2d, con la única diferencia de que almacena un valor único para cada píxel de la pantalla en lugar de imágenes en color que usan 3 valores para crear color. Esto hace que el búfer z aparezca en blanco y negro porque no almacena información de color. El búfer tiene las mismas dimensiones que el búfer de pantalla para mantener la coherencia.

Las pruebas de visibilidad primarias (como la eliminación selectiva de la cara posterior ) y las pruebas de visibilidad secundarias (como las comprobaciones de superposición y el recorte de pantalla) generalmente se realizan en los polígonos de los objetos para omitir polígonos específicos que no son necesarios para renderizar. El búfer Z, en comparación, es comparativamente caro , por lo que realizar pruebas de visibilidad primarias y secundarias libera al búfer z de alguna tarea.

La granularidad de un búfer z tiene una gran influencia en la calidad de la escena: el búfer z tradicional de 16 bits puede producir artefactos (llamados " lucha z " o unión ) cuando dos objetos están muy cerca uno del otro. Un búfer z más moderno de 24 o 32 bits se comporta mucho mejor, aunque el problema no se puede eliminar sin algoritmos adicionales. Una de 8 bits z-buffer casi nunca se utiliza, ya que tiene muy poca precisión.

Usos

El búfer Z es una tecnología utilizada en casi todas las computadoras, portátiles y teléfonos móviles contemporáneos para realizar gráficos de computadora en 3D . El uso principal ahora es para videojuegos , que requieren un procesamiento rápido y preciso de escenas en 3D. El búfer Z se implementa en hardware dentro de las tarjetas gráficas de consumo . El búfer Z también se utiliza (implementado como software en lugar de hardware) para producir efectos especiales generados por computadora para películas.

Además, los datos del búfer Z obtenidos al renderizar una superficie desde el punto de vista de una luz permiten la creación de sombras mediante la técnica de mapeo de sombras .

Desarrollos

Incluso con una granularidad lo suficientemente pequeña, pueden surgir problemas de calidad cuando la precisión en los valores de distancia del búfer z no se distribuye uniformemente a lo largo de la distancia. Los valores más cercanos son mucho más precisos (y por lo tanto pueden mostrar mejor los objetos más cercanos) que los valores que están más lejos. Generalmente, esto es deseable, pero a veces hará que aparezcan artefactos a medida que los objetos se vuelven más distantes. Una variación del almacenamiento en búfer z que da como resultado una precisión distribuida de manera más uniforme se denomina almacenamiento en búfer w (ver más abajo ).

Al comienzo de una nueva escena, el búfer z debe limpiarse a un valor definido, generalmente 1.0, porque este valor es el límite superior (en una escala de 0 a 1) de profundidad, lo que significa que no hay ningún objeto presente en este punto a través del frustum de visualización .

La invención del concepto z-buffer se atribuye con mayor frecuencia a Edwin Catmull , aunque Wolfgang Straßer describió esta idea en su Ph.D. de 1974. tesis meses antes de la invención de Catmull.

En las tarjetas gráficas de PC más recientes (1999-2005), la administración del búfer z utiliza una parte significativa del ancho de banda de memoria disponible . Se han empleado varios métodos para reducir el costo de rendimiento del almacenamiento en búfer z, como la compresión sin pérdidas (los recursos informáticos para comprimir / descomprimir son más baratos que el ancho de banda) y el hardware ultrarrápido z-clear que hace obsoleto el "un cuadro positivo, un cuadro truco negativo "(omitir el borrado entre fotogramas por completo utilizando números con signo para comprobar inteligentemente las profundidades).

Z-sacrificio

En el renderizado , z-culling es la eliminación temprana de píxeles basada en la profundidad, un método que proporciona un aumento en el rendimiento cuando el renderizado de superficies ocultas es costoso. Es una consecuencia directa del almacenamiento en búfer z, donde la profundidad de cada píxel candidato se compara con la profundidad de la geometría existente detrás de la cual podría estar oculto.

Cuando se usa un búfer z, un píxel se puede eliminar (descartar) tan pronto como se conozca su profundidad, lo que permite omitir todo el proceso de iluminación y texturizado de un píxel que de todos modos no sería visible . Además, los sombreadores de píxeles que consumen mucho tiempo generalmente no se ejecutarán para los píxeles seleccionados. Esto hace que z-culling sea un buen candidato de optimización en situaciones en las que la velocidad de relleno , la iluminación, la textura o los sombreadores de píxeles son los principales cuellos de botella .

Si bien el almacenamiento en búfer z permite desordenar la geometría, la clasificación de polígonos aumentando la profundidad (por lo tanto, utilizando un algoritmo de pintor inverso ) permite que cada píxel de la pantalla se renderice menos veces. Esto puede aumentar el rendimiento en escenas con tasa de relleno limitada con grandes cantidades de sobregiro, pero si no se combina con el almacenamiento en búfer z, sufre problemas graves como:

  • los polígonos pueden ocluir entre sí en un ciclo (por ejemplo: el triángulo A ocluye B, B ocluye C, C ocluye A), y
  • no hay un punto "más cercano" canónico en un triángulo (por ejemplo: no importa si se clasifican los triángulos por su centroide o el punto más cercano o el punto más alejado, siempre se pueden encontrar dos triángulos A y B de manera que A esté "más cerca" pero en realidad B debe dibujarse primero).

Como tal, el algoritmo de un pintor inverso no se puede utilizar como una alternativa a la eliminación en Z (sin una reingeniería enérgica), excepto como una optimización para la eliminación en Z. Por ejemplo, una optimización podría ser mantener los polígonos ordenados según la ubicación x / y y la profundidad z para proporcionar límites, en un esfuerzo por determinar rápidamente si dos polígonos podrían tener una interacción de oclusión.

Matemáticas

El rango de valores de profundidad en el espacio de la cámara que se va a renderizar a menudo se define entre un y un valor de .

Después de una transformación de perspectiva , el nuevo valor de o se define por:

Después de una proyección ortográfica , el nuevo valor de o se define por:

donde es el antiguo valor de espacio en la cámara y, a veces, se llama o .

Los valores resultantes de se normalizan entre los valores de -1 y 1, donde el plano está en -1 y el plano en 1. Los valores fuera de este rango corresponden a puntos que no están en el frustum de visualización y no deberían estar prestados.

Representación de punto fijo

Normalmente, estos valores se almacenan en el búfer z del acelerador de gráficos de hardware en formato de punto fijo . Primero se normalizan a un rango más común que es [0, 1] sustituyendo la conversión apropiada en la fórmula anterior:

Simplificando:

En segundo lugar, la fórmula anterior se multiplica por donde d es la profundidad del búfer z (generalmente 16, 24 o 32 bits) y redondeando el resultado a un número entero:

Esta fórmula se puede invertir y derivar para calcular la resolución del búfer z (la 'granularidad' mencionada anteriormente). Lo inverso de lo anterior :

dónde

La resolución del búfer z en términos de espacio de la cámara sería el valor incremental resultante del cambio más pequeño en el número entero almacenado en el búfer z, que es +1 o -1. Por lo tanto, esta resolución se puede calcular a partir de la derivada de en función de :

Expresándolo de nuevo en términos de espacio de cámara, sustituyendo por lo anterior :

Esto muestra que los valores de se agrupan mucho más densamente cerca del plano y mucho más escasamente más lejos, lo que resulta en una mejor precisión más cerca de la cámara. Cuanto más pequeño es, menos precisión hay lejos; tener el plano demasiado cerca es una causa común de artefactos de renderizado no deseados en objetos más distantes.

Para implementar un z-buffer, los valores de se interpolan linealmente en el espacio de la pantalla entre los vértices del polígono actual , y estos valores intermedios generalmente se almacenan en el z-buffer en formato de punto fijo .

Búfer W

Para implementar un w-buffer, los valores antiguos de en el espacio de la cámara, o , se almacenan en el búfer, generalmente en formato de punto flotante . Sin embargo, estos valores no se pueden interpolar linealmente en el espacio de la pantalla desde los vértices; por lo general, deben invertirse , interpolarse y luego invertirse nuevamente. Los valores resultantes de , a diferencia de , están espaciados uniformemente entre y . Hay implementaciones del w-buffer que evitan las inversiones por completo.

Si un búfer z o búfer w da como resultado una mejor imagen depende de la aplicación.

Algoritmia

El siguiente pseudocódigo demuestra el proceso de almacenamiento en búfer z:

// First of all, initialize the depth of each pixel.
d(i, j) = infinite // Max length

// Initialize the color value for each pixel to the background color
c(i, j) = background color

// For each polygon, do the following steps :
for (each pixel in polygon's projection)
{
    // Find depth i.e, z of polygon
    //   at (x, y) corresponding to pixel (i, j)   
    if (z < d(i, j))
    {
        d(i, j) = z;
        c(i, j) = color;
    }
}

Ver también

Referencias

enlaces externos

Notas