stringtranslate.com

Mapeo de sombras

Escena con mapeo de sombras.
Escena sin sombras

El mapeo de sombras o proyección de sombras es un proceso mediante el cual se agregan sombras a gráficos por computadora en 3D . Este concepto fue introducido por Lance Williams en 1978, en un artículo titulado "Proyectar sombras curvas en superficies curvas". [1] Desde entonces, se ha utilizado tanto en escenas pre-renderizadas como en tiempo real en muchos juegos de consola y PC.

Las sombras se crean probando si un píxel es visible desde la fuente de luz, comparando el píxel con un búfer z [2] o una imagen de profundidad de la vista de la fuente de luz, almacenada en forma de textura .

Principio de una sombra y un mapa de sombras.

Si miraras desde una fuente de luz, todos los objetos que puedas ver aparecerían iluminados. Sin embargo, cualquier cosa detrás de esos objetos estaría en la sombra. Este es el principio básico utilizado para crear un mapa de sombras. La vista de la luz se representa, almacenando la profundidad de cada superficie que ve (el mapa de sombras). A continuación, se representa la escena normal comparando la profundidad de cada punto dibujado (como si fuera visto por la luz, en lugar de por el ojo) con este mapa de profundidad.

Esta técnica es menos precisa que los volúmenes de sombras , pero el mapa de sombras puede ser una alternativa más rápida dependiendo de cuánto tiempo de llenado se requiere para cualquiera de las técnicas en una aplicación particular y, por lo tanto, puede ser más adecuado para aplicaciones en tiempo real. Además, los mapas de sombras no requieren el uso de un búfer de plantilla adicional y se pueden modificar para producir sombras con un borde suave. Sin embargo, a diferencia de los volúmenes de sombras, la precisión de un mapa de sombras está limitada por su resolución.

Descripción general del algoritmo

Representar una escena sombreada implica dos pasos de dibujo principales. El primero produce el mapa de sombras y el segundo lo aplica a la escena. Dependiendo de la implementación (y del número de luces), esto puede requerir dos o más pasadas de dibujo.

Creando el mapa de sombras

Escena representada desde la vista de luz.
Escena desde la vista de luz, mapa de profundidad.

El primer paso representa la escena desde el punto de vista de la luz. Para una fuente de luz puntual, la vista debe ser una proyección en perspectiva tan amplia como el ángulo de efecto deseado (será una especie de foco cuadrado). Para luz direccional (por ejemplo, la del Sol ), se debe utilizar una proyección ortográfica .

A partir de esta representación, se extrae y guarda el búfer de profundidad. Debido a que solo la información de profundidad es relevante, es común evitar actualizar los buffers de color y deshabilitar todos los cálculos de iluminación y textura para esta representación, para ahorrar tiempo de dibujo. Este mapa de profundidad suele almacenarse como una textura en la memoria gráfica.

Este mapa de profundidad debe actualizarse cada vez que haya cambios en la luz o en los objetos de la escena, pero se puede reutilizar en otras situaciones, como aquellas en las que solo se mueve la cámara de visualización. (Si hay varias luces, se debe utilizar un mapa de profundidad separado para cada luz).

En muchas implementaciones, resulta práctico representar solo un subconjunto de los objetos de la escena en el mapa de sombras para ahorrar parte del tiempo que lleva volver a dibujar el mapa. Además, se puede aplicar un desplazamiento de profundidad que aleja los objetos de la luz a la representación del mapa de sombras en un intento de resolver problemas de unión donde el valor del mapa de profundidad está cerca de la profundidad de una superficie que se está dibujando (es decir, la proyección de sombra). superficie) en el siguiente paso. Alternativamente, a veces se utiliza seleccionar las caras frontales y representar solo la parte posterior de los objetos en el mapa de sombras para obtener un resultado similar.

Sombreando la escena

El segundo paso es dibujar la escena desde el punto de vista habitual de la cámara , aplicando el mapa de sombras. Este proceso tiene tres componentes principales. El primer paso es encontrar las coordenadas del objeto visto desde la luz, como un objeto 3D solo usa coordenadas 2D con los ejes X e Y para representar su forma geométrica en la pantalla, estas coordenadas de vértice coincidirán con los bordes correspondientes del partes de sombra dentro del propio mapa de sombras (mapa de profundidad). El segundo paso es la prueba de profundidad que compara los valores z del objeto con los valores z del mapa de profundidad y, finalmente, una vez realizada, el objeto debe dibujarse en la sombra o en la luz.

Coordenadas del espacio ligero

Visualización del mapa de profundidad proyectado en la escena.

Para probar un punto con el mapa de profundidad, su posición en las coordenadas de la escena debe transformarse en la posición equivalente vista por la luz. Esto se logra mediante una multiplicación de matrices . La ubicación del objeto en la pantalla está determinada por la transformación de coordenadas habitual , pero se debe generar un segundo conjunto de coordenadas para ubicar el objeto en el espacio luminoso.

La matriz utilizada para transformar las coordenadas del mundo en coordenadas de visualización de la luz es la misma que se usó para representar el mapa de sombras en el primer paso (bajo OpenGL , este es el producto de las matrices de vista de modelo y proyección). Esto producirá un conjunto de coordenadas homogéneas que necesitan una división de perspectiva ( ver proyección 3D ) para convertirse en coordenadas normalizadas del dispositivo , en las que cada componente ( x , y , o z ) cae entre −1 y 1 (si es visible desde la luz). vista). Muchas implementaciones (como OpenGL y Direct3D ) requieren una escala adicional y una multiplicación de matriz de sesgo para asignar esos valores de −1 a 1 a 0 a 1, que son coordenadas más habituales para la búsqueda de mapas de profundidad (mapas de textura). Esta escala se puede realizar antes de la división de perspectiva y se incorpora fácilmente al cálculo de transformación anterior multiplicando esa matriz por lo siguiente:

Si se realiza con un sombreador u otra extensión de hardware de gráficos, esta transformación generalmente se aplica en el nivel de vértice y el valor generado se interpola entre otros vértices y se pasa al nivel de fragmento.

Prueba de mapa de profundidad

Fallos en las pruebas del mapa de profundidad.

Una vez que se encuentran las coordenadas del espacio de luz, los valores xey generalmente corresponden a una ubicación en la textura del mapa de profundidad, y el valor z corresponde a su profundidad asociada, que ahora se puede probar con el mapa de profundidad.

Si el valor z es mayor que el valor almacenado en el mapa de profundidad en la ubicación apropiada ( x , y ), se considera que el objeto está detrás de un objeto que lo ocluye y debe marcarse como falla , para que el dibujo lo dibuje en la sombra. proceso. En caso contrario, deberá dibujarse encendido.

Si la ubicación ( x , y ) queda fuera del mapa de profundidad, el programador debe decidir si la superficie debe estar iluminada o sombreada de forma predeterminada (generalmente iluminada).

En una implementación de sombreador , esta prueba se realizaría a nivel de fragmento. Además, se debe tener cuidado al seleccionar el tipo de almacenamiento del mapa de textura que utilizará el hardware: si no se puede realizar la interpolación, la sombra parecerá tener un borde nítido e irregular (un efecto que se puede reducir con un mayor mapa de sombras). resolución).

Es posible modificar la prueba del mapa de profundidad para producir sombras con un borde suave utilizando un rango de valores (basado en la proximidad al borde de la sombra) en lugar de simplemente pasar o fallar.

La técnica de mapeo de sombras también se puede modificar para dibujar una textura en las regiones iluminadas, simulando el efecto de un proyector . La imagen de arriba titulada "visualización del mapa de profundidad proyectado en la escena" es un ejemplo de tal proceso.

dibujando la escena

Escena final, renderizada con sombras ambientales.

Dibujar la escena con sombras se puede hacer de varias maneras diferentes. Si hay sombreadores programables disponibles, la prueba del mapa de profundidad se puede realizar mediante un sombreador de fragmentos que simplemente dibuja el objeto en la sombra o iluminado según el resultado, dibujando la escena en una sola pasada (después de una pasada inicial anterior para generar el mapa de sombras). .

Si los sombreadores no están disponibles, la prueba del mapa de profundidad generalmente debe implementarse mediante alguna extensión de hardware (como GL_ARB_shadow), que generalmente no permite elegir entre dos modelos de iluminación (iluminado y sombreado) y requiere más pases de renderizado:

  1. Renderiza toda la escena en la sombra. Para los modelos de iluminación más comunes ( consulte el modelo de reflexión Phong ), técnicamente esto debe hacerse utilizando solo el componente ambiental de la luz, pero esto generalmente se ajusta para incluir también una luz tenue y difusa para evitar que las superficies curvas parezcan planas en las sombras.
  2. Habilite la prueba del mapa de profundidad y renderice la escena iluminada. Las áreas donde falla la prueba del mapa de profundidad no se sobrescribirán y permanecerán sombreadas.
  3. Se puede utilizar una pasada adicional por cada luz adicional, utilizando mezclas de aditivos para combinar su efecto con las luces ya dibujadas. (Cada uno de estos pases requiere un pase previo adicional para generar el mapa de sombras asociado).

Las imágenes de ejemplo de este artículo utilizaron la extensión OpenGL GL_ARB_shadow_ambient para realizar el proceso del mapa de sombras en dos pasadas.

Implementaciones de mapas de sombras en tiempo real

Una de las principales desventajas del mapeo de sombras en tiempo real es que el tamaño y la profundidad del mapa de sombras determinan la calidad de las sombras finales. Esto suele ser visible como aliasing o fallos de continuidad de sombras. Una forma sencilla de superar esta limitación es aumentar el tamaño del mapa de sombras, pero debido a limitaciones de memoria, computacionales o de hardware, no siempre es posible. Se han desarrollado técnicas comúnmente utilizadas para mapeo de sombras en tiempo real para sortear esta limitación. Estos incluyen mapas de sombras en cascada, [3] mapas de sombras trapezoidales, [4] mapas de sombras en perspectiva de espacio luminoso, [5] o mapas de sombras divididas en paralelo. [6]

También es notable que las sombras generadas, incluso si no tienen alias, tienen bordes duros, lo que no siempre es deseable. Para emular sombras suaves del mundo real , se han desarrollado varias soluciones, ya sea realizando varias búsquedas en el mapa de sombras, generando geometría destinada a emular el borde suave o creando mapas de sombras de profundidad no estándar. Ejemplos notables de estos son los mapas de filtrado porcentual más cercano, [7] batidos, [8] y sombras de varianza. [9]

Técnicas de mapeo de sombras

Simple

Terrible

Pandeo

Suavizado

Filtración

Sombras suaves

Clasificado

Misceláneas

Ver también

Otras lecturas

Referencias

  1. ^ Lanza Williams. "Proyectar sombras curvas sobre superficies curvas" (PDF) . Consultado el 22 de diciembre de 2020 . {{cite journal}}: Citar diario requiere |journal=( ayuda )
  2. ^ Akenine-Mo ̈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. ^ "Mapas de sombras en cascada" (PDF) . NVIDIA . Consultado el 14 de febrero de 2008 . {{cite journal}}: Citar diario requiere |journal=( ayuda )
  4. ^ Tobías Martín; Tiow-Seng Tan. "Suavizado y continuidad con mapas de sombras trapezoidales" . Consultado el 14 de febrero de 2008 . {{cite journal}}: Citar diario requiere |journal=( ayuda )
  5. ^ Michael Wimmer; Daniel Scherzer; Werner Purgathofer. "Mapas de sombras en perspectiva de espacio luminoso" . Consultado el 14 de febrero de 2008 . {{cite journal}}: Citar diario requiere |journal=( ayuda )
  6. ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. "Mapas de sombras divididos en paralelo en GPU programables". Gemas GPU 3 . Archivado desde el original el 17 de enero de 2010 . Consultado el 14 de febrero de 2008 .
  7. ^ "Antialiasing del mapa de sombras". NVIDIA . Consultado el 14 de febrero de 2008 .
  8. ^ Eric Chan, Fredo Durand, Marco Corbetta . "Representación de sombras suaves falsas con batidos" . Consultado el 14 de febrero de 2008 . {{cite journal}}: Citar diario requiere |journal=( ayuda )Mantenimiento CS1: varios nombres: lista de autores ( enlace )
  9. ^ William Donnelly; Andrés Lauritzen. "Mapas de sombras de varianza" . Consultado el 14 de febrero de 2008 .
  10. ^ "Técnicas comunes para mejorar los mapas de profundidad de las sombras". msdn.microsoft.com . Consultado el 7 de noviembre de 2021 .
  11. ^ "Mapas de sombras en cascada". msdn.microsoft.com . Consultado el 7 de noviembre de 2021 .
  12. ^ Donnelly, William; Lauritzen, Andrew (14 de marzo de 2006). "Mapas de sombras de varianza". Actas del simposio de 2006 sobre juegos y gráficos 3D interactivos: SI3D '06 . Asociación para Maquinaria de Computación. págs. 161-165. doi :10.1145/1111411.1111440. ISBN 159593295X. S2CID  538139 . Consultado el 7 de noviembre de 2021 a través de la Biblioteca digital ACM.

enlaces externos