
Un búfer Z , también conocido como búfer de profundidad , es un tipo de búfer de datos utilizado en gráficos por computadora para almacenar la información de profundidad de los fragmentos. Los valores almacenados representan la distancia a la cámara, siendo 0 la distancia más cercana. El esquema de codificación puede invertirse, de modo que el número más alto corresponda al valor más cercano a la cámara.
En un proceso de renderizado 3D , cuando un objeto se proyecta en la pantalla, la profundidad (valor z) de un fragmento generado en la imagen proyectada se compara con el valor almacenado en el búfer ( prueba de profundidad ) y, si el nuevo valor es menor, se reemplaza. Esto funciona en conjunto con el rasterizador , que calcula los valores de color. El fragmento generado por el rasterizador se guarda si no está superpuesto por otro fragmento.
El búfer Z es una técnica utilizada en casi todos los ordenadores, portátiles y teléfonos móviles actuales para generar gráficos 3D . Su uso principal hoy en día es en videojuegos , que requieren un procesamiento rápido y preciso de escenas 3D.
Uso
Oclusión
Determinar qué se debe mostrar en la pantalla y qué se debe omitir es un proceso de varios pasos que utiliza diversas técnicas . El uso de un búfer Z es el paso final de este proceso.
Cada vez que un objeto se renderiza en el framebuffer, el z-buffer se utiliza para comparar los valores z de los fragmentos con el valor z que ya está en el z-buffer (es decir, comprobar cuál está más cerca). Si el nuevo valor z está más cerca que el valor anterior, el fragmento se escribe en el framebuffer y este nuevo valor más cercano se escribe en el z-buffer. Si el valor z está más lejos que el valor en el z-buffer, el fragmento se descarta. 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 oculta a uno más lejano. Esto se denomina z-culling .
La granularidad del búfer Z influye enormemente en la calidad de la escena: el búfer Z tradicional de 16 bits puede generar artefactos (conocidos como " z-fighting " o "stigging ") cuando dos objetos están muy cerca. Un búfer Z más moderno de 24 o 32 bits ofrece un rendimiento mucho mejor, aunque el problema no se puede eliminar sin algoritmos adicionales. El búfer Z de 8 bits casi nunca se utiliza debido a su escasa precisión.
Mapeo de sombras
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 . [ 1 ]
Historia
El Z-buffering fue descrito por primera vez en 1974 por Wolfgang Straßer en su tesis doctoral sobre algoritmos rápidos para la representación de objetos ocluidos. [ 2 ] 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.
Los búferes Z suelen implementarse mediante hardware en las tarjetas gráficas de consumo . El almacenamiento en búfer Z también se utiliza (implementado por software en lugar de hardware) para producir efectos especiales generados por ordenador para películas.
Desarrollos
Incluso con una granularidad suficientemente pequeña, pueden surgir problemas de calidad cuando la precisión de los valores de distancia del búfer Z no se distribuye uniformemente. Los valores más cercanos son mucho más precisos (y, por lo tanto, pueden mostrar mejor los objetos cercanos) que los valores más lejanos. Generalmente, esto es deseable, pero a veces provoca la aparición de artefactos a medida que los objetos se alejan. Una variante del búfer Z que da como resultado una precisión distribuida de manera más uniforme se denomina búfer W (véase más abajo ).
Al inicio de una nueva escena, el búfer Z debe borrarse hasta un valor definido, normalmente 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 visión .
La invención del concepto de búfer 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 de PC más recientes (1999-2005), la gestió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 coste de rendimiento del 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 borrado Z por hardware ultrarrápido que deja obsoleto el truco de "un fotograma positivo, un fotograma negativo" (omitiendo por completo el borrado entre fotogramas mediante números con signo para comprobar las profundidades de forma inteligente).
Algunos juegos, especialmente varios de la última etapa del ciclo de vida de la Nintendo 64 , optaron por minimizar el z-buffering (por ejemplo, renderizando primero el fondo sin z-buffering y usándolo solo para los objetos en primer plano) o incluso omitirlo por completo, para reducir los requisitos de ancho de banda y memoria, respectivamente. Super Smash Bros. y F-Zero X son dos juegos de Nintendo 64 que minimizaron el z-buffering para aumentar la velocidad de fotogramas . Varios juegos de Factor 5 también lo minimizaron u omitieron. En la Nintendo 64, el z-buffering puede consumir hasta cuatro veces más ancho de banda que no usarlo. [ 3 ]
Mechwarrior 2 en PC admitía resoluciones de hasta 800 × 600 [ 4 ] en el 3dfx Voodoo original de 4 MB debido a que no utilizaba búfer Z.
Eliminación de Z
En el renderizado , el z-culling es una técnica de eliminación temprana de píxeles basada en la profundidad, que mejora 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 tras la cual podría estar oculto.
Al usar un búfer Z, un píxel se puede descartar tan pronto como se conoce 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 descartados. Esto convierte al descarte de píxeles en una buena opción de optimización en situaciones donde la tasa de relleno , la iluminación, el texturizado o los sombreadores de píxeles son los principales cuellos de botella .
Si bien el búfer Z permite que la geometría no esté ordenada, ordenar los polígonos por profundidad creciente (utilizando así 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 velocidad de relleno limitada y grandes cantidades de sobreimpresión, pero si no se combina con el búfer Z, sufre graves problemas como:
- polígonos que se ocluyen entre sí en un ciclo (por ejemplo, el triángulo A ocluye a B, B ocluye a C, C ocluye a A).
- la falta de un punto "más cercano" canónico en un triángulo (es decir, no importa si se ordenan los triángulos por su centroide , punto más cercano o punto más lejano, siempre se pueden encontrar dos triángulos A y B tales que A está "más cerca", pero en realidad B debería dibujarse primero).
Por lo tanto, un algoritmo de pintura inversa no puede utilizarse como alternativa al z-culling (sin una reingeniería compleja), salvo como una optimización del z-culling. Por ejemplo, una optimización podría consistir en mantener los polígonos ordenados según su posición x/y y profundidad z para establecer límites, con el fin de 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 unyvalor 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:
dóndees el antiguo valor deen el espacio de la cámara, y a veces se le llamao.
Los valores resultantes dese normalizan entre los valores de –1 y 1, donde elEl avión está en –1 y elEl plano está en 1. Los valores fuera de este rango corresponden a puntos que no están en el tronco de visión y no deben renderizarse.
Representación de punto fijo
Normalmente, estos valores se almacenan en el búfer Z del acelerador gráfico de hardware en formato de punto fijo . Primero se normalizan a un rango más común, que es [0, 1], mediante la sustitución de la conversión adecuada.en la fórmula anterior:
Simplificando:
Segundo, la fórmula anterior se multiplica pordonde d es la profundidad del búfer Z (normalmente 16, 24 o 32 bits) y redondeando el resultado a un 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 decomo función de:
Expresándolo de nuevo en términos del espacio de la cámara, sustituyendopor lo anterior:
Esto demuestra que los valores dese agrupan mucho más densamente cerca de laplano, y mucho más dispersos a mayor distancia, lo que resulta en una mayor precisión cerca de la cámara. El más pequeñoes, cuanto menos precisión haya lejos, teniendo laEl plano demasiado cercano es una causa común de artefactos de renderizado indeseables en objetos más distantes. [ 6 ]
Para implementar un búfer Z, los valores dese 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 .
búfer W
Para implementar un w-buffer, [ 7 ] los valores antiguos deen 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; normalmente tienen que invertirse , interpolarse y luego volver a invertirse. Los valores resultantes de, en contraposición a, están espaciados uniformemente entreyExisten implementaciones del w-buffer que evitan por completo las inversiones.
Que un búfer Z o un búfer W produzca 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, inicializamos 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 fondo. c(i, j) = color de fondo // Para cada polígono, siga los siguientes pasos: para (cada píxel en la proyección del polígono) { // Calcula la profundidad, es decir, la coordenada 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
- ↑ Akenine-Möller, Tomas; Haines, Eric; Hoffman, Naty (6 de agosto de 2018). Renderizado en tiempo real, cuarta edición . CRC Press. ISBN 978-1-351-81615-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 mantenimiento: falta el editor de ubicación ( enlace ) - ↑ Cómo implementé MegaTextures en hardware real de Nintendo 64 , consultado el 4 de enero de 2024.
- ↑ Comparación de aceleración 3D Ep11: Mechwarrior 2 - 3DFX / PowerVR / S3 Virge / ATI Rage / Matrox Mys , consultado el 4 de enero de 2024
- ↑ La organización OpenGL. "Open GL / FAQ 2 - Precisión del búfer de profundidad" . Consultado el 26 de diciembre de 2017 .
- ↑ Grégory Massal. "Búfer de profundidad: los detalles más crudos" . Archivado del original el 15 de octubre de 2008. Consultado el 3 de agosto de 2008 .
- ↑ Steve Baker. "Aprender a amar tu búfer Z" . Consultado el 3 de enero de 2018 .
Enlaces externos
- Aprende a amar tu búfer Z
- Mezcla alfa y búfer Z
Notas
- ↑ Véase Wolfgang K. Giloi , JL Encarnação, W. Straßer. "La Escuela de Informática Gráfica de Giloi". Gráficos por computadora 35 4:12–16.
- Renderizado 3D