Articulo de referencia

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 3D por computadora . Este...

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 3D por computadora . 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 prerrenderizadas como en tiempo real en muchos juegos de consola y PC.

Las sombras se crean comprobando 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 observaras desde una fuente de luz, todos los objetos visibles aparecerían iluminados. Sin embargo, todo lo que se encuentre detrás de esos objetos estaría en sombra. Este es el principio básico para crear un mapa de sombras. La vista de la fuente de luz se renderiza, almacenando la profundidad de cada superficie que percibe (el mapa de sombras). A continuación, se renderiza la escena principal comparando la profundidad de cada punto dibujado (como si fuera visto por la luz, en lugar del ojo) con este mapa de profundidad.

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

Descripción general del algoritmo

La representación de una escena con sombras implica dos pasos principales de dibujo. El primero genera 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.

Creación del mapa de sombras

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

El primer paso consiste en representar la escena desde el punto de vista de la luz. Para una fuente de luz puntual, la proyección debe ser una perspectiva tan amplia como el á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 este renderizado, se extrae y guarda el búfer de profundidad. Dado que solo la información de profundidad es relevante, es común evitar actualizar los búferes de color y desactivar todos los cálculos de iluminación y textura para este renderizado, con el fin de 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 puede reutilizarse 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 independiente para cada una).

En muchas implementaciones, resulta práctico renderizar solo un subconjunto de los objetos de la escena en el mapa de sombras para ahorrar tiempo al redibujarlo. Asimismo, se puede aplicar un desplazamiento de profundidad que aleje los objetos de la luz durante la renderización del mapa de sombras para intentar solucionar problemas de unión cuando el valor del mapa de profundidad es cercano a la profundidad de la superficie que proyecta la sombra en el siguiente paso. Como alternativa, a veces se opta por descartar las caras frontales y renderizar solo la parte posterior de los objetos en el mapa de sombras para obtener un resultado similar.

Sombreando la escena

El segundo paso consiste en 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 vistas desde la luz, ya que un objeto 3D solo utiliza coordenadas 2D con ejes X e Y para representar su forma geométrica en pantalla; estas coordenadas de vértice coincidirán con los bordes correspondientes de las partes sombreadas 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 completado, el objeto debe dibujarse en sombra o iluminado.

Coordenadas del espacio de luz

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

Para contrastar 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 se determina mediante la transformación de coordenadas habitual , pero se debe generar un segundo conjunto de coordenadas para ubicar el objeto en el espacio de la luz.

La matriz utilizada para transformar las coordenadas del mundo en las coordenadas de visión de la luz es la misma que la utilizada para renderizar el mapa de sombras en el primer paso (en OpenGL , esta es el producto de las matrices de modelo, vista y proyección). Esto producirá un conjunto de coordenadas homogéneas que necesitan una división de perspectiva ( véase proyección 3D ) para convertirse en coordenadas de dispositivo normalizadas , en las que cada componente ( x , y o z ) se encuentra entre -1 y 1 (si es visible desde la vista de la luz). Muchas implementaciones (como OpenGL y Direct3D ) requieren una multiplicación adicional de matrices de escala y sesgo para mapear 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). Este escalado se puede realizar antes de la división de perspectiva y se integra fácilmente en el cálculo de transformación anterior multiplicando esa matriz por lo siguiente:

[0,5000,500,500,5000,50,50001]{\displaystyle {\begin{bmatrix}0.5&0&0&0.5\\0&0.5&0&0.5\\0&0&0.5&0.5\\0&0&0&1\end{bmatrix}}}

Si se realiza con un sombreador u otra extensión de hardware gráfico, esta transformación se aplica normalmente a 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 de mapas de profundidad

Una vez que se encuentran las coordenadas del espacio de luz, los valores x e y 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 comparar con el mapa de profundidad.

Si el valor z es mayor que el valor almacenado en el mapa de profundidad en la ubicación ( x , y ) correspondiente, el objeto se considera que está detrás de un objeto que lo ocluye y debe marcarse como un fallo , para ser dibujado en sombra durante el proceso de dibujo. De lo contrario, debe dibujarse iluminado.

Si la ubicación ( x , y ) cae 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 sombreado , esta prueba se realizaría a nivel de fragmento. Además, es necesario tener cuidado al seleccionar el tipo de almacenamiento de mapas de texturas que utilizará el hardware: si no se puede realizar la interpolación, la sombra aparecerá con un borde afilado y dentado (un efecto que se puede reducir con una mayor resolución del mapa de sombras).

Es posible modificar la prueba del mapa de profundidad para producir sombras con bordes suaves utilizando un rango de valores (en función de la proximidad al borde de la sombra) en lugar de simplemente aprobar o reprobar.

La técnica de mapeo de sombras también puede modificarse para dibujar una textura sobre las regiones iluminadas, simulando el efecto de un proyector . La imagen superior, titulada "Visualización del mapa de profundidad proyectado sobre la escena", es un ejemplo de este proceso.

Dibujando la escena

Escena final, renderizada con sombras ambientales.

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

Si no se dispone de sombreadores, la realización de la prueba del mapa de profundidad normalmente debe implementarse mediante alguna extensión de hardware (como GL_ARB_shadow ), que normalmente no permite elegir entre dos modelos de iluminación (iluminado y sombreado) y requiere más pasadas de renderizado:

  1. Renderiza toda la escena en sombra. Para los modelos de iluminación más comunes ( ver modelo de reflexión de Phong ), técnicamente esto debería hacerse utilizando solo el componente ambiental de la luz, pero generalmente se ajusta para incluir también una luz difusa tenue para evitar que las superficies curvas parezcan planas en la sombra.
  2. Habilita la prueba del mapa de profundidad y renderiza la escena iluminada. Las áreas donde falle la prueba del mapa de profundidad no se sobrescribirán y permanecerán en sombra.
  3. Se puede utilizar una pasada adicional para cada luz adicional, empleando la fusión aditiva para combinar su efecto con las luces ya dibujadas. (Cada una de estas pasadas requiere una pasada previa adicional para generar el mapa de sombras correspondiente).

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

Implementaciones en tiempo real de mapas de sombras

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 restricciones de memoria, computación o hardware, no siempre es posible. Se han desarrollado técnicas de uso común para el mapeo de sombras en tiempo real con el fin de sortear esta limitación. Estas incluyen mapas de sombras en cascada, [ 3 ] mapas de sombras trapezoidales, [ 4 ] mapas de sombras de perspectiva de espacio de luz, [ 5 ] o mapas de sombras de división paralela. [ 6 ]

También cabe destacar que las sombras generadas, incluso sin aliasing, presentan bordes duros, lo cual no siempre es deseable. Para emular sombras suaves del mundo real , se han desarrollado diversas soluciones, como realizar varias búsquedas en el mapa de sombras, generar geometría para emular el borde suave o crear mapas de sombras de profundidad no estándar. Algunos ejemplos notables son el filtrado de porcentaje de acercamiento, [ 7 ] los suavizados [ 8 ] y los mapas de sombras de varianza. [ 9 ]

Técnicas de mapeo de sombras

Simple

  • SSM "Simple"

Terrible

  • PSSM "División en paralelo" https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
  • CSM "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 la luz" https://www.cg.tuwien.ac.at/research/vr/lispsm/
  • TSM "Trapecio" http://www.comp.nus.edu.sg/~tants/tsm.html
  • PSM "Perspectiva" http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
  • CSSM "Espacio de la cámara" http://bib.irb.hr/datoteka/570987.12_CSSM.pdf

Suavizado

  • PCF "Filtrado de porcentaje de proximidad" https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html

Filtración

  • ESM "Exponencial" https://discovery.ucl.ac.uk/id/eprint/10001/1/10001.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 siluetas de mapas de sombras" http://bondarev.nl/?p=326

Sombras suaves

  • PCSS "Porcentaje de acercamiento" http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
  • VSSM "Mapeo de sombras suaves de variación" https://jankautz.com/publications/VSSM_PG2010.pdf
  • SSSS "Sombras suaves en el 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 "Adaptativo" https://www.cs.cornell.edu/~kb/publications/ASM.pdf
  • AVSM "Volumétrico Adaptativo" 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 "Adaptativo profundo"
  • 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 "Rectilíneo" 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
  • Distribución de muestras SDSM https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
  • SPPSM "Perspectiva del plano separador" http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
  • SSSM "Silueta de sombra" http://graphics.stanford.edu/papers/silmap/silmap.pdf

Misceláneas

  • Mapas de profundidad de sombras (SDM) [ 10 ]
  • Mapas de sombras en perspectiva (PSM)
  • Mapas de sombras con perspectiva espacial de luz (LSPSM)
  • Mapas de sombras en cascada (CSM) [ 11 ]
  • Mapas de sombra de varianza (VSM) [ 12 ]

Véase también

Lecturas adicionales

  • Transiciones suaves de penumbra con mapas de sombras Willem H. de Boer
  • El mapeo de sombras directo realiza la prueba de sombras en el espacio del ojo en lugar del espacio de la luz para mantener un acceso a la textura más secuencial.

Referencias

  1. Lance Williams. "Proyectando sombras curvas en superficies curvas" (PDF) . Consultado el 22 de diciembre de 2020 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  2. 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.
  3. "Mapas de sombras en cascada" (PDF) . NVidia . Consultado el 14 de febrero de 2008 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  4. Tobias Martin; Tiow-Seng Tan. "Antialiasing y continuidad con mapas de sombras trapezoidales" . Consultado el 14 de febrero de 2008 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  5. Michael Wimmer; Daniel Scherzer; Werner Purgathofer. "Mapas de sombras de perspectiva de espacio de luz" . Consultado el 14 de febrero de 2008 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  6. Fan Zhang; Hanqiu Sun; Oskari Nyman. "Mapas de sombras con división paralela en GPU programables" . GPU Gems 3. Archivado del original el 17 de enero de 2010. Consultado el 14 de febrero de 2008 .
  7. "Antialiasing de mapa de sombras" . NVidia . Consultado el 14 de febrero de 2008 .
  8. Eric Chan, Fredo Durand, Marco Corbetta . "Rendering Fake Soft Shadows with Smoothies" . Consultado el 14 de febrero de 2008 .{{cite journal}}: La cita de la revista requiere |journal=( ayuda ) CS1 maint: nombres múltiples: lista de autores ( enlace )
  9. William Donnelly; Andrew Lauritzen. "Mapas de sombras de variación" . Consultado el 14 de febrero de 2008 .
  10. "Técnicas comunes para mejorar los mapas de profundidad de 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 gráficos y juegos 3D interactivos - SI3D '06 . Association for Computing Machinery. págs. 161–165 . doi : 10.1145/1111411.1111440 . ISBN  159593295X. S2CID 538139 . Recuperado el 7 de noviembre de 2021 a través de la Biblioteca Digital de ACM. 
  • Mapeo de sombras por hardware , nVidia
  • Mapeo de sombras con el hardware OpenGL actual , nVidia
  • Tutorial paso a paso de Riemer para implementar el mapeo de sombras con HLSL y DirectX.
  • Mejoras en el mapeo de sombras mediante GLSL
  • Algoritmos y técnicas de sombreado en tiempo real de NVIDIA
  • Implementación de mapeo de sombras usando Java y OpenGL