stringtranslate.com

Buffer Z

Datos del búfer Z

Un buffer de profundidad , también conocido como buffer z , es un tipo de buffer de datos utilizado en gráficos de computadora para representar información de profundidad de objetos en el espacio 3D desde una perspectiva particular . La profundidad se almacena como un mapa de altura de la escena, los valores representan una distancia a la cámara, siendo 0 el más cercano. El esquema de codificación se puede invertir con el número más alto siendo el valor más cercano a la cámara. Los buffers de profundidad son una ayuda para renderizar una escena para garantizar que los polígonos correctos ocluyan correctamente otros polígonos. El buffering Z fue descrito por primera vez en 1974 por Wolfgang Straßer en su tesis doctoral sobre algoritmos rápidos para renderizar objetos ocluidos. [1] 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 resultados incorrectos.

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

Al visualizar una imagen que contiene objetos o superficies opacas superpuestas parcial o totalmente, no es posible ver completamente aquellos objetos que están más alejados 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 gestionar las superficies superpuestas, las superficies se renderizarían unas sobre otras, sin importar si se supone que deben 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 del 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 búfer z permitirá la reproducción correcta de la percepción de profundidad habitual: un objeto cercano oculta a uno más alejado. Esto se llama "z-culling" .

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 único valor para cada píxel de la pantalla en lugar de imágenes en color que utilizan 3 valores para crear el color. Esto hace que el búfer z parezca 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 de la cara posterior ) y las pruebas de visibilidad secundarias (como las comprobaciones de superposición y el recorte de pantalla) se realizan generalmente 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 parte de su 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 dar lugar a artefactos (denominados " z-fighting " o "stitching " ) 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. Un búfer z de 8 bits casi nunca se utiliza porque tiene muy poca precisión.

Usos

El buffering Z es una técnica que se utiliza en casi todos los ordenadores, portátiles y teléfonos móviles actuales para realizar gráficos por ordenador en 3D . Su uso principal actual es en los videojuegos , que requieren un procesamiento rápido y preciso de escenas en 3D. Los buffers Z suelen implementarse en el hardware de las tarjetas gráficas de consumo . El buffering Z también se utiliza (implementado como software en lugar de como hardware) para producir efectos especiales generados por ordenador para películas. [ cita requerida ]

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 . [2]

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. Por lo general, esto es deseable, pero a veces hará que aparezcan artefactos a medida que los objetos se alejan. Una variación del búfer z que da como resultado una precisión distribuida de manera más uniforme se denomina búfer w (consulte a continuación).

Al comienzo de una nueva escena, el búfer z se debe borrar 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 de buffer z se atribuye con mayor frecuencia a Edwin Catmull , aunque Wolfgang Straßer describió esta idea en su tesis doctoral de 1974 meses antes de la invención de Catmull. [a]

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

Algunos juegos, en particular varios juegos posteriores en el ciclo de vida de N64 , decidieron minimizar el buffering Z (por ejemplo, renderizando primero el fondo sin buffering Z y solo usando buffering Z para los objetos de primer plano) u omitirlo por completo, para reducir los requisitos de ancho de banda de memoria y los requisitos de memoria respectivamente. Super Smash Bros. y F-Zero X son dos juegos de N64 que minimizaron el buffering Z para aumentar las velocidades de cuadros. Varios juegos de Factor 5 también minimizaron u omitieron el buffering Z. En N64, el buffering Z puede consumir hasta 4 veces más ancho de banda en comparación con no usar el buffering Z. [3]

Mechwarrior 2 en PC admitía resoluciones de hasta 800x600 [4] en el 3DFX Voodoo original de 4 MB debido a que no utilizaba Z Buffering.


Eliminación selectiva Z

En el renderizado , el z-culling es la eliminación temprana de píxeles en función de 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 z-buffering, 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.

Al utilizar un búfer z, se puede descartar un píxel tan pronto como se conoce su profundidad, lo que permite omitir todo el proceso de iluminación y texturización 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 descartados. Esto hace que el z-culling sea un buen candidato de optimización en situaciones en las que la tasa de relleno , la iluminación, la texturización 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, ordenar los polígonos aumentando la profundidad (utilizando así un algoritmo de pintor inverso ) permite que cada píxel de la pantalla se represente menos veces. Esto puede aumentar el rendimiento en escenas con una tasa de relleno limitada y grandes cantidades de sobredibujo, pero si no se combina con el almacenamiento en búfer z, sufre graves problemas como:

Por lo tanto, un algoritmo de pintor inverso no se puede utilizar como una alternativa a la eliminación de Z (sin una reingeniería exhaustiva), excepto como una optimización de la eliminación de 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 representar a menudo se define entre a y un valor de .

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

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

donde es el valor antiguo de en el espacio de 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 está 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 renderizarse.

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 adecuada 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 (normalmente 16, 24 o 32 bits) y se redondea el resultado a un número entero: [5]

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

dónde

La resolución del búfer z en términos del espacio de la cámara sería el valor incremental resultante del cambio más pequeño en el 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 como una función de :

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

Esto demuestra que los valores de se agrupan de forma mucho más densa cerca del plano y de forma mucho más dispersa más lejos, lo que da como resultado una mejor precisión más cerca de la cámara. Cuanto más pequeño es, menos precisión hay a distancia: tener el plano demasiado cerca es una causa común de artefactos de renderizado no deseados en objetos más distantes. [6]

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

Buffer W

Para implementar un w-buffer, [7] 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 a través del espacio de la pantalla desde los vértices; por lo general, se deben invertir , interpolar y luego invertir 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 un búfer w dan como resultado una mejor imagen depende de la aplicación.

Algoritmia

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

//En primer lugar, inicialice la profundidad de cada píxel.d(i, j) = infinito // Longitud máxima// Inicializa el valor de color de cada píxel al color de fondoc(i, j) = color de fondo// Para cada polígono, realice los siguientes pasos:para (cada píxel en la proyección del polígono){    // Encuentra la profundidad, es decir, z del polígono    // en (x, y) correspondiente al píxel (i, j)       si (z < d(i, j))    {        d(i, j) = z;        c(i, j) = color;    }}

Véase también

Referencias

  1. ^ Straßer, Wolfgang (26 de abril de 1974). "Zukünftige Arbeiten". Schnelle Kurven- und Flächendarstellung auf grafischen Sichtgeräten [ Visualización rápida de curvas y superficies en dispositivos de visualización gráfica ] (PDF) (en alemán). Berlina. 6-1.{{cite book}}: CS1 maint: location missing publisher (link)
  2. ^ Akenine-Möller, Tomas; Haines, Eric; Hoffman, Naty (6 de agosto de 2018). Real-Time Rendering, cuarta edición. CRC Press. ISBN 978-1-351-81615-1.
  3. ^ Cómo implementé MegaTextures en hardware real de Nintendo 64 , consultado el 4 de enero de 2024
  4. ^ Comparación de aceleración 3D Ep11: Mechwarrior 2 - 3DFX / PowerVR / S3 Virge / ATI Rage / Matrox Mys , consultado el 4 de enero de 2024
  5. ^ La Organización OpenGL. «Open GL / FAQ 2 - Depth Buffer Precision» (Open GL / Preguntas frecuentes 2: precisión del búfer de profundidad) . Consultado el 26 de diciembre de 2017 .
  6. ^ Grégory Massal. «Depth buffer – the gritty details». Archivado desde el original el 15 de octubre de 2008. Consultado el 3 de agosto de 2008 .
  7. ^ Steve Baker. "Aprendiendo a amar tu búfer Z" . Consultado el 3 de enero de 2018 .

Enlaces externos

Notas

  1. ^ Véase Wolfgang K. Giloi  [de] , JL Encarnação, W. Straßer. "La Escuela de Informática Gráfica de Giloi". Gráficos por computadora 35 4:12–16.