stringtranslate.com

almacenamiento en búfer Z

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 . Las zonas de influencia de profundidad son una ayuda para renderizar una escena para garantizar que los polígonos correctos ocluyen 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 representar 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 eficiencia y resultados incorrectos.

En un proceso de renderizado 3D , cuando se proyecta un objeto en la pantalla, la profundidad (valor z) de un fragmento generado en la imagen de la 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 se superpone con otro fragmento.

Al visualizar una imagen que contiene superficies o objetos opacos superpuestos total o parcialmente, 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 representarían una encima de la otra, sin importar si deben estar detrás de otros objetos. La identificación y eliminación de estas superficies se denomina problema de superficie oculta . Para verificar 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 búfer z permitirá reproducir correctamente la percepción de profundidad habitual: un objeto cercano oculta otro más lejano. Esto se llama selección 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 utilizan 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 primaria (como la selección de la cara posterior ) y las pruebas de visibilidad secundaria (como comprobaciones de superposición y 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 Z-buffer, en comparación, es comparativamente caro , por lo que realizar pruebas de visibilidad primaria y secundaria libera al z-buffer de algunas tareas.

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 provocar artefactos (llamados " lucha z " o costura ) 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 solucionar sin algoritmos adicionales. Casi nunca se utiliza un búfer z de 8 bits porque tiene muy poca precisión.

Usos

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

Además, los datos del búfer Z obtenidos al representar una superficie desde el punto de vista de la 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 más lejanos. 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 más uniformemente se llama almacenamiento en búfer w (ver más abajo).

Al comienzo de una nueva escena, el búfer z debe borrarse 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 esta escena. apunte a través del tronco de visualizació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 doctorado de 1974. tesis 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 búfer 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 z-buffering, 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 deja obsoleto el sistema "un fotograma positivo, un fotograma". truco "negativo" (omitiendo el borrado entre fotogramas por completo utilizando números con signo para comprobar inteligentemente las profundidades).

Algunos juegos, en particular varios juegos posteriores en el ciclo de vida del N64 , decidieron minimizar el almacenamiento en búfer Z (por ejemplo, renderizando el fondo primero sin el almacenamiento en búfer z y solo usando el almacenamiento en búfer Z para los objetos en primer plano) o omitirlo por completo, para reducir requisitos de ancho de banda de memoria y requisitos de memoria respectivamente. Super Smash Bros. y F-Zero X son dos juegos de N64 que minimizaron el almacenamiento en búfer Z para aumentar la velocidad de fotogramas. Varios juegos de Factor 5 también minimizaron u omitieron el almacenamiento en búfer Z. En el N64, el búfer Z puede consumir hasta 4 veces más ancho de banda que no utilizar el búfer 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 utiliza Z Buffering.


sacrificio Z

En el renderizado , el 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 utiliza un búfer z, un píxel se puede seleccionar (descartar) 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 seleccionados. Esto hace que el z-culling sea un buen candidato para la optimización en situaciones donde la tasa de relleno , la iluminación, las texturas o los sombreadores de píxeles son los principales cuellos de botella .

Mientras que el almacenamiento en búfer z permite que la geometría no esté ordenada, ordenar los polígonos aumentando la profundidad (usando 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 sobregiro, pero si no se combina con el almacenamiento en búfer z, presenta problemas graves como:

Como tal, el algoritmo de pintor inverso no se puede utilizar como alternativa al Z-culling (sin una ardua reingeniería), excepto como una optimización del Z-culling. 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 suele definirse entre a y el 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:

¿Dónde está el valor anterior de en el espacio de la cámara y, a veces, se denomina o ?

Los valores resultantes de están normalizados 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 tronco de visualización y no deberían ser prestado.

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 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). 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 en términos de espacio de cámara, sustituyéndolo por lo anterior :

Esto muestra que los valores de se agrupan mucho más densamente cerca del plano y mucho más dispersamente 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 en la 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 en el 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 .

W-búfer

Para implementar un w-buffer, [7] los valores antiguos de en el espacio de la cámara, o , se almacenan en el buffer, 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, deben invertirse , interpolarse y luego invertirse nuevamente. Los valores resultantes de , a diferencia de , están espaciados uniformemente entre y . Hay implementaciones de 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:

// Primero que nada, inicializa 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, realiza 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(yo, j))    {        d(yo, j) = z;        c(i, j) = color;    }}

Ver 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). Representación en tiempo real, cuarta edición. Prensa CRC. 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 / Preguntas frecuentes 2: Precisión del búfer de profundidad" . Consultado el 26 de diciembre de 2017 .
  6. ^ Gregorio Massal. "Búfer de profundidad: los detalles valientes". Archivado desde el original el 15 de octubre de 2008 . Consultado el 3 de agosto de 2008 .
  7. ^ Steve panadero. "Aprender a amar tu Z-buffer" . 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.