El volumen de sombras es una técnica utilizada en gráficos por computadora en 3D para agregar sombras a una escena renderizada. Fueron propuestos por primera vez por Frank Crow en 1977 [1] como la geometría que describe la forma tridimensional de la región ocluida de 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 del búfer de plantilla de volúmenes de sombra generalmente se considera una de las técnicas de sombreado en tiempo real de propósito general más prácticas para su uso en hardware de gráficos 3D moderno [ cita requerida ] . Ha sido popularizado por el videojuego Doom 3 , y una variación particular de la técnica utilizada en este juego se conoce como Carmack's Reverse.
Los volúmenes de sombras se han convertido en una herramienta popular para el sombreado en tiempo real, junto con el más venerable mapeo de sombras . La principal ventaja de los volúmenes de sombra es que son precisos hasta el píxel (aunque muchas implementaciones tienen un problema menor de autosombreado a lo largo del borde de la silueta, consulte la construcción a continuación), mientras que la precisión de un mapa de sombras depende de la memoria de textura que se le asigna. así como el ángulo en el que se proyectan las sombras (en algunos ángulos, la precisión de un mapa de sombras inevitablemente se ve afectada). Sin embargo, la técnica requiere la creación de una geometría de sombra, que puede consumir mucha CPU (según la implementación). La ventaja del mapeo de sombras es que suele ser más rápido, porque los polígonos de volumen de sombras suelen ser muy grandes en términos de espacio de pantalla y requieren mucho tiempo de llenado (especialmente para objetos convexos), mientras que los mapas de sombras no tienen esta limitación.
Para construir un volumen de sombra, proyecte un rayo desde la fuente de luz a través de cada vértice del objeto que proyecta la sombra hasta algún punto (generalmente en el infinito). Estas proyecciones juntas formarán un volumen; cualquier punto dentro de ese volumen está en sombra, todo lo exterior está iluminado por la luz.
Para un modelo poligonal, el volumen generalmente se forma clasificando cada cara del modelo como orientada hacia la fuente de luz o en dirección opuesta a la fuente de luz. El conjunto de todos los bordes que conectan una cara hacia afuera con una cara alejada forman la silueta con respecto a la fuente de luz. Los bordes que forman la silueta se extruyen lejos de la luz para construir las caras del volumen de sombra. Este volumen debe extenderse a lo largo de toda la escena visible; a menudo, las dimensiones del volumen de sombra se extienden hasta el infinito para lograr esto (consulte la optimización a continuación). Para formar un volumen cerrado, se deben cubrir los extremos frontal y posterior de esta extrusión. Estos revestimientos se denominan "gorras". Dependiendo del método utilizado para el volumen de sombra, el extremo frontal puede estar cubierto por el objeto mismo y, en ocasiones, se puede omitir el extremo posterior (consulte el paso de profundidad a continuación).
También hay un problema con la sombra donde las caras a lo largo del borde de la silueta son relativamente poco profundas. 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 aproximado cerca del borde de la silueta que es difícil de corregir. Aumentar la densidad poligonal minimizará el problema, pero no lo eliminará. Si el frente del volumen de sombra está tapado, 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:
Después de Crow, en 1991, Tim Heidmann mostró cómo utilizar el búfer de plantilla para representar sombras con volúmenes de sombras lo suficientemente rápido como para usarlas en aplicaciones de tiempo real. Hay tres variaciones comunes de esta técnica, pase en profundidad , fallo en profundidad y or exclusivo , pero todas utilizan el mismo proceso:
La diferencia entre estos tres métodos se da en la generación de la máscara en el segundo paso. Algunos implican dos pases y otros sólo uno; algunos requieren menos precisión en el buffer de la plantilla.
Los volúmenes de sombras 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 ve agravado por la complejidad de los objetos que proyectan sombras, ya que cada objeto puede proyectar su propio volumen de sombra de cualquier tamaño potencial en la pantalla. Consulte la optimización a continuación para obtener una discusión sobre las técnicas utilizadas para combatir el problema del tiempo de llenado.
Heidmann propuso que si las superficies frontales y posteriores de las sombras se representaran en pasadas separadas, el número de caras frontales y posteriores frente a un objeto se puede contar usando el búfer de plantilla. Si la superficie de un objeto está en sombra, habrá más superficies de sombra orientadas hacia el frente entre él y el ojo que superficies de sombra orientadas hacia atrás. Sin embargo, si sus números son iguales, la superficie del objeto no está en sombra. La generación de la máscara de plantilla funciona de la siguiente manera:
Una vez logrado esto, todas las superficies iluminadas corresponderán a un 0 en el buffer de la plantilla, donde el número de superficies frontales y posteriores de todos los volúmenes de sombra entre el ojo y esa superficie son iguales.
Este enfoque tiene problemas cuando el ojo mismo está 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 buffer de la plantilla, invirtiendo efectivamente las sombras. Esto se puede solucionar agregando una superficie de "tapa" al frente del volumen de sombra que mira hacia el ojo, como en el plano de recorte frontal . Existe 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 taparse de alguna manera para evitar un problema similar. En las implementaciones más comunes, debido a que puede ser difícil lograr un límite adecuado para el paso en profundidad, se puede autorizar el método de falla en profundidad (ver más abajo) para estas situaciones especiales. Alternativamente, se puede darle al búfer de plantilla un sesgo de +1 por cada volumen de sombra en el que se encuentre la cámara, aunque la detección puede ser lenta.
Existe otro problema potencial si el búfer de plantilla no tiene suficientes bits para acomodar la cantidad de sombras visibles entre el ojo y la superficie del objeto, porque utiliza aritmética de saturación . (Si en su lugar usaran desbordamiento aritmético , el problema sería insignificante).
La prueba de paso en profundidad también se conoce como prueba de paso z , ya que el búfer de profundidad a menudo se denomina búfer z.
Alrededor del año 2000, varias personas descubrieron que el método de Heidmann podía funcionar en todas las posiciones de la cámara invirtiendo la profundidad. En lugar de contar las superficies de sombra delante de la superficie del objeto, las superficies detrás de él se pueden contar con la misma facilidad, con el mismo resultado final. Esto resuelve el problema de que el ojo esté en la sombra, ya que los volúmenes de sombra entre el ojo y el objeto no se cuentan, pero introduce la condición de que se debe tapar el extremo posterior del volumen de sombra, o las sombras terminarán faltando donde apunta el volumen. hacia atrás hasta el infinito.
El método de fallo en profundidad tiene las mismas consideraciones con respecto a la precisión del búfer de plantilla que el método de paso en profundidad. Además, al igual que el paso en profundidad, a veces se lo denomina método de falla 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. [2] Sim Dietrich presentó esta técnica tanto en GDC en marzo de 1999 como en Creativity a finales de 1999. [3] [4] Unos meses más tarde, William Bilodeau y Michael Songy presentaron una solicitud de patente estadounidense para la técnica el mismo año titulada "Método para representar sombras usando un volumen de sombra y un buffer de plantilla". [5] John Carmack de id Software descubrió de forma independiente el algoritmo en 2000 durante el desarrollo de Doom 3 . [6]
Cualquiera de los tipos anteriores se puede aproximar con una variación exclusiva o , que no se ocupa adecuadamente de los volúmenes de sombras que se cruzan, pero ahorra una pasada de renderizado (si no es tiempo de llenado) y solo requiere un búfer de plantilla de 1 bit. Los siguientes pasos son para la versión de pase profundo: