Articulo de referencia

Volumen de sombra

Ejemplo del sombreado con plantilla de Carmack en Doom 3 El volumen de sombra es una técnica utilizada en gráficos 3D por computadora para agregar sombras a una escena renderiza...

Ejemplo del sombreado con plantilla de Carmack en Doom 3

El volumen de sombra es una técnica utilizada en gráficos 3D por computadora para agregar sombras a una escena renderizada. Fue propuesta por primera vez por Frank Crow en 1977 [ 1 ] como la geometría que describe la forma 3D de la región ocluida por una fuente de luz. Un volumen de sombra divide el mundo virtual en dos: áreas que están en sombra y áreas que no lo están.

La implementación de volúmenes de sombra mediante búfer de plantilla se utilizó ampliamente en la renderización en tiempo real, y se empleó notablemente en el videojuego Doom 3 [ 2 ] . La variación particular de la técnica utilizada en este juego se conoce como Carmack's Reverse .

En la renderización moderna en tiempo real, las técnicas de mapeo de sombras y sus variaciones se han vuelto más utilizadas [ 3 ] [ 4 ] , debido a sus características de rendimiento y compatibilidad con las canalizaciones de renderización contemporáneas [ 5 ] .

Construcción

Para construir un volumen de sombra, se proyecta un rayo desde la fuente de luz a través de cada vértice del objeto que proyecta la sombra hasta un punto determinado (generalmente en el infinito). Estas proyecciones formarán un volumen; cualquier punto dentro de ese volumen estará en sombra, mientras que todo lo que esté fuera estará iluminado.

Para un modelo poligonal, el volumen se suele formar clasificando cada cara como orientada hacia la fuente de luz o alejada de ella. El conjunto de aristas que conectan una cara orientada hacia la fuente de luz con una cara alejada de ella forma la silueta con respecto a la fuente de luz. Estas aristas se extruyen alejándose de la luz para construir las caras del volumen de sombra. Este volumen debe abarcar toda la escena visible; a menudo, sus dimensiones se extienden hasta el infinito para lograrlo (véase la optimización más adelante). Para formar un volumen cerrado, los extremos frontal y posterior de esta extrusión deben estar cubiertos. Estas cubiertas se denominan «tapas». Dependiendo del método utilizado para el volumen de sombra, el extremo frontal puede estar cubierto por el propio objeto, mientras que el extremo posterior a veces se omite (véase el paso de profundidad más adelante).

También existe un problema con la sombra cuando las caras a lo largo del borde de la silueta son relativamente planas. En este caso, la sombra que un objeto proyecta sobre sí mismo será nítida, revelando sus facetas poligonales, mientras que el modelo de iluminación habitual tendrá un cambio gradual en la iluminación a lo largo de la faceta. Esto deja un artefacto de sombra rugosa cerca del borde de la silueta que es difícil de corregir. Aumentar la densidad poligonal minimizará el problema, pero no lo eliminará. Si se limita el frente del volumen de sombra, todo el volumen de sombra puede desplazarse ligeramente lejos de la luz para eliminar cualquier autointersección de sombra dentro de la distancia de desplazamiento del borde de la silueta (esta solución se usa más comúnmente en el mapeo de sombras ).

Los pasos básicos para formar un volumen de sombra son:

  1. Encuentra todos los bordes de la silueta (bordes que separan las caras frontales de las caras posteriores).
  2. Extiende todos los bordes de la silueta en dirección opuesta a la fuente de luz.
  3. Agregue una tapa frontal y/o una tapa trasera a cada superficie para formar un volumen cerrado (puede que no sea necesario, dependiendo de la implementación utilizada).
Ilustración de volúmenes de sombra. La imagen superior izquierda muestra una escena sombreada mediante volúmenes de sombra. A la derecha, los volúmenes de sombra se muestran en estructura alámbrica. Observe cómo las sombras forman una gran área cónica que apunta en dirección opuesta a la fuente de luz (el punto blanco brillante).

Implementaciones de búfer de plantilla

Después de Crow, en 1991 Tim Heidmann demostró cómo usar el búfer de plantilla para renderizar sombras con volúmenes de sombra lo suficientemente rápido como para usarlo en aplicaciones en tiempo real. Hay tres variaciones comunes de esta técnica: paso de profundidad , fallo de profundidad y OR exclusivo , pero todas ellas usan el mismo proceso:

  1. Representa la escena como si estuviera completamente en sombra.
  2. Para cada fuente de luz:
    1. Utilizando la información de profundidad de esa escena, construya una máscara en el búfer de plantilla que tenga agujeros solo donde la superficie visible no esté en sombra.
    2. Vuelve a renderizar la escena como si estuviera completamente iluminada, utilizando el búfer de plantilla para enmascarar las zonas sombreadas. Aplica la fusión aditiva para añadir este renderizado a la escena.

La diferencia entre estos tres métodos radica en la generación de la máscara en el segundo paso. Algunos requieren dos pasadas, otros solo una; algunos exigen menor precisión en el búfer de plantilla.

Los volúmenes de sombra tienden a cubrir grandes porciones de la escena visible y, como resultado, consumen un valioso tiempo de rasterización (tiempo de relleno) en el hardware de gráficos 3D. Este problema se agrava por la complejidad de los objetos que proyectan sombras, ya que cada objeto puede proyectar su propio volumen de sombra de cualquier tamaño en pantalla. Consulte la sección de optimización a continuación para obtener información sobre las técnicas utilizadas para solucionar el problema del tiempo de relleno.

Paso de profundidad

Heidmann propuso que si las superficies frontales y posteriores de las sombras se renderizaban en pasadas separadas, el número de caras frontales y posteriores frente a un objeto se puede contar utilizando el búfer de plantilla. Si la superficie de un objeto está en sombra, habrá más superficies de sombra frontales entre este y el ojo que superficies de sombra posteriores. Sin embargo, si su número es igual, la superficie del objeto no está en sombra. La generación de la máscara de plantilla funciona de la siguiente manera:

  1. Deshabilitar las escrituras en los búferes de profundidad y color.
  2. Utilice el descarte de caras posteriores .
  3. Configure la operación de plantilla para que se incremente en el paso de profundidad (solo cuente las sombras que estén delante del objeto).
  4. Renderiza los volúmenes de sombra (debido al descarte de objetos, solo se renderizan sus caras frontales).
  5. Utilice el descarte de caras frontales.
  6. Configure la operación de la plantilla para que disminuya en cada pasada de profundidad.
  7. Renderiza los volúmenes de sombra (solo se renderizan sus caras posteriores).

Según la característica de Euler , todas las superficies iluminadas corresponderán a un 0 en el búfer de la plantilla, donde el número de superficies frontales y posteriores de todas las variedades cerradas (volúmenes de sombra) es igual.

Este enfoque tiene problemas cuando el ojo se encuentra dentro de un volumen de sombra (por ejemplo, cuando la fuente de luz se mueve detrás de un objeto). Desde este punto de vista, el ojo ve la cara posterior de este volumen de sombra antes que nada, y esto agrega un sesgo de -1 a todo el búfer de plantilla, invirtiendo efectivamente las sombras. Esto se puede remediar agregando una superficie de "tapa" al frente del volumen de sombra que mira al ojo, como en el plano de recorte frontal . Hay otra situación en la que el ojo puede estar en la sombra de un volumen proyectado por un objeto detrás de la cámara, que también debe ser tapado de alguna manera para evitar un problema similar. En la mayoría de las implementaciones comunes, debido a que el tapado adecuado para el paso de profundidad puede ser difícil de lograr, se puede usar el método de fallo de profundidad (ver más abajo) para estas situaciones especiales. Alternativamente, se puede dar al búfer de plantilla un sesgo de +1 por cada volumen de sombra dentro del cual se encuentra la cámara, aunque hacer la detección puede ser lento.

Existe otro problema potencial si el búfer de plantilla no tiene suficientes bits para contener la cantidad de sombras visibles entre el ojo y la superficie del objeto, lo que puede provocar un desbordamiento cuando hay suficientes volúmenes de sombra en la escena. Si se utiliza aritmética de saturación , el problema puede agravarse, ya que algunos cálculos de volumen pueden omitirse.

Las pruebas de paso de profundidad también se conocen como pruebas de paso Z , ya que al búfer de profundidad se le suele llamar búfer Z.

Fallo de profundidad

Hacia el año 2000, varias personas descubrieron que el método de Heidmann podía aplicarse a todas las posiciones de cámara invirtiendo la profundidad. En lugar de contar las superficies de sombra delante de la superficie del objeto, se pueden contar las superficies detrás con la misma facilidad, obteniendo el mismo resultado. Esto resuelve el problema de que el ojo quede en sombra, ya que no se cuentan los volúmenes de sombra entre el ojo y el objeto, pero introduce la condición de que el extremo posterior del volumen de sombra debe estar cerrado, o las sombras no aparecerán donde el volumen apunta hacia el infinito.

  1. Deshabilitar las escrituras en los búferes de profundidad y color.
  2. Utilice el descarte de caras frontales.
  3. Configure la operación de plantilla para que incremente en caso de fallo de profundidad (solo cuente las sombras detrás del objeto).
  4. Renderiza los volúmenes de sombra.
  5. Utilice la eliminación de caras posteriores.
  6. Configure la operación de la plantilla para que disminuya en caso de fallo de profundidad.
  7. Renderiza los volúmenes de sombra.

El método de fallo de profundidad tiene en cuenta la misma precisión del búfer de plantilla que el método de paso de profundidad. Asimismo, al igual que este último, a veces se le denomina método de fallo Z.

William Bilodeau y Michael Songy descubrieron esta técnica en octubre de 1998 y la presentaron en Creativity, una conferencia de desarrolladores de Creative Labs, en 1999. [ 6 ] Sim Dietrich presentó esta técnica tanto en la GDC en marzo de 1999 como en Creativity a finales de 1999. [ 7 ] [ 8 ] Unos meses más tarde, William Bilodeau y Michael Songy presentaron una solicitud de patente estadounidense para la técnica ese mismo año titulada "Método para renderizar sombras usando un volumen de sombra y un búfer de plantilla". [ 9 ] John Carmack de id Software descubrió independientemente el algoritmo en 2000 durante el desarrollo de Doom 3. [ 10 ] Se permitió a id Software usar la patente de Creative a cambio de que el juego promocionara el sistema de audio EAX de la compañía . [ 11 ] Esta patente expiró en octubre de 2019. [ 12 ]

Exclusivo o

Cualquiera de los tipos anteriores puede aproximarse con una variación de OR exclusivo , que no maneja adecuadamente los volúmenes de sombra que se intersecan, pero ahorra una pasada de renderizado (si no tiempo de relleno) y solo requiere un búfer de plantilla de 1 bit. Los siguientes pasos corresponden a la versión de pasada de profundidad:

  1. Deshabilitar las escrituras en los búferes de profundidad y color.
  2. Configure la operación de plantilla en XOR en el paso de profundidad (voltear en cualquier superficie de sombra).
  3. Renderiza los volúmenes de sombra.

Mejoramiento

  • Un método para acelerar los cálculos de la geometría del volumen de sombras consiste en utilizar partes existentes del pipeline de renderizado para realizar parte del cálculo. Por ejemplo, mediante el uso de coordenadas homogéneas , la coordenada w puede establecerse en cero para extender un punto hasta el infinito. Esto debe ir acompañado de un frustum de visualización con un plano de recorte lejano que se extienda hasta el infinito para dar cabida a esos puntos, lo cual se logra mediante el uso de una matriz de proyección especializada. Esta técnica reduce ligeramente la precisión del búfer de profundidad, pero la diferencia suele ser insignificante. Véase el artículo de 2002 «Volúmenes de sombras con plantilla prácticos y robustos para renderizado acelerado por hardware», de C. Everitt y M. Kilgard , para una implementación detallada.
  • El tiempo de rasterización de los volúmenes de sombra se puede reducir utilizando una prueba de recorte en el hardware para limitar las sombras a un rectángulo específico en la pantalla.
  • Se puede lograr una sola pasada utilizando una variable integrada del sombreador para detectar las caras frontales en lugar de dos pasadas separadas para descartar una sobre la otra, combinado con la sustitución del búfer de plantilla por una mezcla aritmética en el búfer de color.
  • Nvidia ha implementado una función de hardware llamada prueba de límites de profundidad , diseñada para eliminar partes de los volúmenes de sombra que no afectan a la escena visible. (Esta función está disponible desde el modelo GeForce FX 5900). En la Game Developers Conference de 2005 se presentó una discusión sobre esta función y su uso con volúmenes de sombra. [ 13 ]
  • Dado que el método depth-fail solo ofrece una ventaja sobre depth-pass en el caso especial en que el ojo se encuentra dentro de un volumen de sombra, es preferible verificar este caso y usar depth-pass siempre que sea posible. Esto evita tanto el cierre posterior innecesario (y la rasterización asociada) para los casos en que depth-fail no es necesario, como el problema del cierre frontal adecuado para los casos especiales de depth-pass .
  • En las arquitecturas de GPU más recientes, se pueden usar sombreadores de geometría para generar los volúmenes de sombra. [ 14 ] [ 15 ]
  • En sistemas que no admiten sombreadores de geometría, también se pueden usar sombreadores de vértices para crear volúmenes de sombra extruyendo selectivamente vértices que ya residen en la memoria de la GPU. [ 16 ]

Véase también

Referencias

  1. Crow, Franklin C: " Algoritmos de sombra para gráficos por computadora ", Computer Graphics (Actas de SIGGRAPH '77) , vol. 11, n.° 2, 242–248.
  2. "Capítulo 9. Renderizado eficiente de volumen de sombras | NVIDIA Developer" . developer.nvidia.com . Consultado el 18 de julio de 2026 .
  3. "Sombras en el Universal Render Pipeline | Universal RP | 12.0.0" . docs.unity3d.com . Consultado el 18 de julio de 2026 .
  4. "Mapas de sombras virtuales en Unreal Engine | Documentación de Unreal Engine 5.8 | Comunidad de desarrolladores de Epic" . dev.epicgames.com . Consultado el 18 de julio de 2026 .
  5. "Un estudio sobre algoritmos de sombras suaves en tiempo real" (PDF) . Archivado del original (PDF) el 2 de diciembre de 2023.
  6. Yen, Hun (3 de diciembre de 2002). "La teoría de los volúmenes de sombras de plantilla" . GameDev.net. Archivado del original el 29 de diciembre de 2011. Consultado el 12 de septiembre de 2010 .
  7. "¿¡Patentado de sombras con plantilla!? ¡¿Qué demonios?! - GameDev.net" . 29 de julio de 2004. Consultado el 28 de marzo de 2012 .
  8. "Las patentes creativas revierten el éxito de Carmack" . The Tech Report. 29 de julio de 2004. Archivado del original el 31 de enero de 2010. Consultado el 12 de septiembre de 2010 .
  9. US 6384822 , Bilodeau, William y Songy, Michael, "Método para renderizar sombras usando un volumen de sombra y un búfer de plantilla", publicado el 7 de mayo de 2002, asignado a Creative Technology Ltd. 
  10. Kilgard, Mark; John Carmack. "John Carmack sobre volúmenes de sombra..." Página de Volúmenes de Sombra Prácticos y Robustos de NVIDIA Developer Zone . archive.org: NVIDIA. Archivado del original el 27 de enero de 2009. Recuperado el 18 de octubre de 2012 .
  11. Ars Technica: John Carmack: "Esto apesta" - 28 de julio de 2004.
  12. "US6384822B1 - Método para renderizar sombras usando un volumen de sombra y un búfer de plantilla" . Consultado el 23 de febrero de 2026 .
  13. Lengyel, Eric. "Renderizado avanzado de sombras de plantilla y cuña penumbral" (PDF) . Game Developers Conference 2005. 2005. Consultado el 18 de octubre de 2012 .
  14. "GPU Gems 3: Capítulo 11. Volúmenes de sombras eficientes y robustos mediante oclusión jerárquica y sombreadores de geometría | Zona de desarrolladores de NVIDIA" . developer.nvidia.com . Archivado del original el 16 de mayo de 2011. Consultado el 12 de enero de 2022 .
  15. ^ Stich, Martín; Carsten Wächter; Alejandro Keller (2007). "Capítulo 11 "Volumenes de sombras eficientes y robustos utilizando sombreadores de geometría y selección de oclusión jerárquica"" . GPU Gems 3 . archive.org: nVidia / Addison-Wesley. Archivado del original el 16 de mayo de 2011 . Recuperado el 18 de octubre de 2012 .
  16. Brennan, Chris. "Extrusión de volumen de sombra usando un sombreador de vértices" (PDF) . AMD . Archivado del original el 8 de diciembre de 2022. Recuperado el 14 de febrero de 2018 .{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )