El mapeo de sombras o la proyección de sombras es un proceso mediante el cual se agregan sombras a los gráficos de computadora en 3D . Este concepto fue introducido por Lance Williams en 1978, en un artículo titulado "Proyección de 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 un mapa de sombras y un mapa de sombras
Si miras desde una fuente de luz, todos los objetos que puedes ver aparecerían en la luz. 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. Se renderiza la vista de la luz, almacenando la profundidad de cada superficie que ve (el mapa de sombras). A continuación, se renderiza la escena normal comparando la profundidad de cada punto dibujado (como si estuviera siendo visto por la luz, en lugar del 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 relleno se requiera 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 estarcido 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
La representación de una escena sombreada implica dos pasos principales de dibujo. El primero produce el mapa de sombras en sí mismo y el segundo lo aplica a la escena. Dependiendo de la implementación (y el número de luces), esto puede requerir dos o más pasadas de dibujo.
Creando el mapa de sombras
El primer paso renderiza 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 su ángulo de efecto deseado (será una especie de foco cuadrado). Para la luz direccional (por ejemplo, la del Sol ), se debe utilizar una proyección ortográfica .
A partir de esta representación, el búfer de profundidad se extrae y se guarda. Debido a que solo la información de profundidad es relevante, es común evitar actualizar los búferes 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 a menudo se almacena como una textura en la memoria de gráficos.
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 usar un mapa de profundidad separado para cada luz).
En muchas implementaciones, es práctico representar solo un subconjunto de los objetos de la escena en el mapa de sombras para ahorrar algo del tiempo que se necesita para 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 los problemas de costura 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 sombras superficie) en el siguiente paso. Alternativamente, para obtener un resultado similar, a veces se utiliza la selección de caras frontales y solo la representación de la parte posterior de los objetos en el mapa de sombras.
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 primero es encontrar las coordenadas del objeto como se ve desde la luz, el segundo es la prueba que compara esa coordenada con el mapa de profundidad, y finalmente, una vez realizado, el objeto debe dibujarse en sombra o luz.
Coordenadas del espacio de luz
Para probar un punto contra 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 claro.
La matriz utilizada para transformar las coordenadas del mundo en las coordenadas de visualización de la luz es la misma que se utilizó para representar el mapa de sombras en el primer paso (en OpenGL, este es el producto de las matrices modelview y de proyección). Esto producirá un conjunto de coordenadas homogéneas que necesitan una división perspectiva ( ver la proyección en 3D ) para convertirse en coordenadas de dispositivos normalizados , en los que cada componente ( x , y , o z ) cae entre -1 y 1 (si es visible de 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 (mapa de texturas). Esta escala se puede hacer antes de la división de perspectiva y se puede plegar fácilmente en el cálculo de transformación anterior multiplicando esa matriz con lo siguiente:
Si se hace 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
Una vez que se encuentran las coordenadas espaciales de luz, la x y Y valores generalmente corresponden a una ubicación en el mapa de profundidad de la textura, y los z corresponde valor a su profundidad asociado, que ahora pueden ser probados contra 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 oclusivo y debe marcarse como un fallo , para que el dibujo lo dibuje en la sombra. proceso. De lo contrario, debe 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 por defecto (normalmente 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 afilado y dentado (un efecto que se puede reducir con un mapa de sombras mayor 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 aprobar o reprobar.
La técnica del 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
Dibujar la escena con sombras se puede hacer de varias formas diferentes. Si hay sombreadores programables disponibles, la prueba del mapa de profundidad puede ser realizada por 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 realización de 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 (iluminados y sombreados) y requieren más pases de renderizado:
- Renderiza toda la escena a la sombra. Para los modelos de iluminación más comunes ( consulte el modelo de reflexión de Phong ), esto debería hacerse técnicamente utilizando solo el componente ambiental de la luz, pero esto generalmente se ajusta para incluir también una luz difusa tenue para evitar que las superficies curvas aparezcan planas en la sombra.
- 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.
- Se puede usar una pasada adicional por cada luz adicional, usando mezcla 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 de 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 fallas de continuidad de sombras o aliasing . Una forma sencilla de superar esta limitación es aumentar el tamaño del mapa de sombra, pero debido a limitaciones de memoria, computacionales o de hardware, no siempre es posible. Se han desarrollado técnicas de uso común para el 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 con perspectiva de espacio de luz, [5] o mapas de sombras paralelas divididas. [6]
También es notable que las sombras generadas, incluso sin aliasing, 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 el filtrado porcentual más cercano, [7] Smoothies, [8] y los mapas de sombras de varianza. [9]
Técnicas de mapeo de sombras
Sencillo
- SSM "Simple"
Terrible
- PSSM "División en paralelo" https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
- CSM "en cascada" http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf
Pandeo
- LiSPSM "Perspectiva del espacio de luz" https://www.cg.tuwien.ac.at/research/vr/lispsm/
- TSM "Trapezoide" http://www.comp.nus.edu.sg/~tants/tsm.html
- PSM "Perspectiva" http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
- CSSM "Espacio de cámara" http://bib.irb.hr/datoteka/570987.12_CSSM.pdf
Suavizado
- PCF "Porcentaje de filtrado más cercano" https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html
Filtración
- ESM "Exponencial" http://www.cad.zju.edu.cn/home/jqfeng/papers/Exponential%20Soft%20Shadow%20Mapping.pdf
- CSM "Convolución" https://doclib.uhasselt.be/dspace/bitstream/1942/8040/1/3227.pdf
- VSM "Varianza" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
- SAVSM "Varianza de área sumada" https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-8-summed-area-variance-shadow-maps
- SMSR "Revectorización de silueta de mapa de sombras" http://bondarev.nl/?p=326
Sombras suaves
- PCSS "Porcentaje más cercano" http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
- SSSS "Sombras suaves del espacio de la pantalla" http://www.crcnetbase.com/doi/abs/10.1201/b10648-36
- FIV "Vector de irradiancia de esfera completa" http://getlab.org/publications/FIV/
Clasificado
- ASM "Adaptive" http://www.cs.cornell.edu/~kb/publications/ASM.pdf
- AVSM "Adaptive Volumetric" https://web.archive.org/web/20101208213624/http://visual-computing.intel-research.net/art/publications/avsm/
- CSSM "Espacio de cámara" http://free-zg.t-com.hr/cssm/
- DASM "Deep Adaptive"
- DPSM "Paraboloide dual" http://sites.google.com/site/osmanbrian2/dpsm.pdf
- DSM "Deep" http://graphics.pixar.com/library/DeepShadows/paper.pdf
- FSM "Adelante" http://www.cs.unc.edu/~zhangh/technotes/shadow/shadow.ps
- LPSM "Logarítmico" http://gamma.cs.unc.edu/LOGSM/
- MDSM "Profundidad múltiple" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.3376&rep=rep1&type=pdf
- RTW "Rectilinear" http://www.cspaul.com/wiki/doku.php?id=publications:rosen.2012.i3d
- RMSM "Resolución coincidente" http://www.idav.ucdavis.edu/func/return_pdf?pub_id=919
- SDSM "Distribución de muestra" https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
- SPPSM "Perspectiva del plano de separación" http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
- SSSM "Silueta de sombra" http://graphics.stanford.edu/papers/silmap/silmap.pdf
Diverso
- Mapas de profundidad de sombra (SDM) [10]
- Mapas de sombra en perspectiva (PSM)
- Mapas de sombras con perspectiva de espacio de luz (LSPSM)
- Mapas de sombras en cascada (CSM) [11]
- Mapas de sombras de varianza (VSM) [12]
Ver también
- Volumen de sombras , otra técnica de sombreado
- Ray casting , una técnica más lenta que se utiliza a menudo en el trazado de rayos
- Mapeo de fotones , una técnica mucho más lenta capaz de una iluminación muy realista
- Radiosidad , otra técnica muy lenta pero muy realista
Otras lecturas
- Transiciones suaves de Penumbra con mapas de sombras Willem H. de Boer
- El mapeo de sombras hacia adelante realiza la prueba de sombras en el espacio ocular en lugar de en el espacio de luz para mantener el acceso a la textura más secuencial.
Referencias
- ^ Lance Williams. "Proyección de sombras curvas en superficies curvas" (PDF) . Consultado el 22 de diciembre de 2020 . Cite journal requiere
|journal=
( ayuda ) - ^ Akenine-Mo ̈ller, Tomas; Haines, Eric; Hoffman, Naty (6 de agosto de 2018). Renderizado en tiempo real, cuarta edición . Prensa CRC. ISBN 978-1-351-81615-1.
- ^ "Mapas de sombras en cascada" (PDF) . NVidia . Consultado el 14 de febrero de 2008 {{citas inconsistentes}} Cite journal requiere
|journal=
( ayuda )CS1 maint: posdata ( enlace ) - ^ Tobias Martin; Tiow-Seng Tan. "Anti-aliasing y continuidad con mapas de sombras trapezoidales" . Consultado el 14 de febrero de 2008 . Cite journal requiere
|journal=
( ayuda ) - ^ Michael Wimmer; Daniel Scherzer; Werner Purgathofer. "Mapas de sombra de perspectiva de espacio de luz" . Consultado el 14 de febrero de 2008 . Cite journal requiere
|journal=
( ayuda ) - ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. "Mapas de sombras divididos en paralelo en GPU programables" . Gemas de GPU 3 . Archivado desde el original el 17 de enero de 2010 . Consultado el 14 de febrero de 2008 .
- ^ "Antialiasing del mapa de sombras" . NVidia . Consultado el 14 de febrero de 2008 .
- ^ Eric Chan, Fredo Durand, Marco Corbetta . "Representación de sombras suaves falsas con batidos" . Consultado el 14 de febrero de 2008 . Cite journal requiere
|journal=
( ayuda )CS1 maint: varios nombres: lista de autores ( enlace ) - ^ William Donnelly; Andrew Lauritzen. "Mapas de sombras de varianza" . Consultado el 14 de febrero de 2008 .
- ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx
- ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx
- ^ http://dl.acm.org/citation.cfm?doid=1111411.1111440
enlaces externos
- Mapeo de sombras de hardware , nVidia
- Mapeo de sombras con el hardware OpenGL actual , nVidia
- Tutorial paso a paso de Riemer que implementa Shadow Mapping con HLSL y DirectX
- Mejoras para el mapeo de sombras usando GLSL
- Técnicas y algoritmos de sombra en tiempo real de NVIDIA
- Implementación de Shadow Mapping usando Java y OpenGL