De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda
Ejemplo de la sombra de la plantilla de Carmack en Doom 3 .

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 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 del búfer de esténcil de los 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 mapeo de sombras más venerable . La principal ventaja de los volúmenes de sombra es que son precisos al píxel (aunque muchas implementaciones tienen un problema menor de auto-sombreado a lo largo del borde de la silueta, ver construccióna continuación), mientras que la precisión de un mapa de sombras depende de la memoria de textura asignada, así como del ángulo en el que se proyectan las sombras (en algunos ángulos, la precisión de un mapa de sombras inevitablemente sufre). Sin embargo, la técnica requiere la creación de geometría de sombra, que puede requerir un uso intensivo de la CPU (según la implementación). La ventaja del mapeo de sombras es que a menudo es 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 relleno (especialmente para objetos convexos), mientras que los mapas de sombras no tienen esta limitación.

Construcción [ editar ]

Para construir un volumen de sombra, proyecte un rayo desde la fuente de luz a través de cada vértice en el objeto de proyección de sombra hasta algún punto (generalmente en el infinito). Estas proyecciones juntas formarán un volumen; cualquier punto dentro de ese volumen está en sombras, todo lo exterior está iluminado por la luz.

Para un modelo poligonal, el volumen generalmente se forma clasificando cada cara en el modelo como orientada hacia la fuente de luz o alejada de la fuente de luz. El conjunto de todos los bordes que conectan una cara hacia una cara a otra forma 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 sobre el rango de toda la escena visible; A menudo, las dimensiones del volumen de la sombra se extienden hasta el infinito para lograr esto (ver optimizaciónabajo.) 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 la sombra, la parte delantera puede estar cubierta por el objeto en sí, y la parte trasera a veces puede omitirse (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 proyecta un objeto 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 rugoso cerca del borde de la silueta que es difícil de corregir. El aumento de la densidad poligonal minimizará el problema, pero no lo eliminará. Si la parte frontal del volumen de la sombra está tapada, todo el volumen de la sombra puede desplazarse ligeramente hacia la luz para eliminar cualquier intersección de la 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. Extienda todos los bordes de la silueta en la dirección que se aleja de 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 de arriba a la izquierda muestra una escena sombreada con volúmenes de sombra. A la derecha, los volúmenes de sombra se muestran en forma de alambre. Observe cómo las sombras forman un área cónica grande que apunta en dirección opuesta a la fuente de luz (el punto blanco brillante).

Implementaciones de búfer de plantilla [ editar ]

Después de Crow, en 1991 Tim Heidmann mostró cómo usar el búfer de estarcido para renderizar sombras con volúmenes de sombras lo suficientemente rápido para usar en aplicaciones en tiempo real. Hay tres variaciones comunes de esta técnica, pase de profundidad , fallo de profundidad y exclusivo-o , pero todas utilizan el mismo proceso:

  1. Renderice la escena como si estuviera completamente a la sombra.
  2. Para cada fuente de luz:
    1. Con la información de profundidad de esa escena, construya una máscara en el búfer de estarcido que tenga agujeros solo donde la superficie visible no esté en la sombra.
    2. Renderice la escena nuevamente como si estuviera completamente iluminada, usando el búfer de estarcido para enmascarar las áreas sombreadas. Use mezcla aditiva para agregar este render a la escena.

La diferencia entre estos tres métodos se produce en la generación de la máscara en el segundo paso. Algunos involucran dos pases y otros solo uno; algunos requieren menos precisión en el búfer 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 sombras de cualquier tamaño potencial en la pantalla. Consulte la optimización a continuación para ver una discusión de las técnicas utilizadas para combatir el problema del tiempo de llenado.

Pase de profundidad [ editar ]

Heidmann propuso que si las superficies frontales y posteriores de las sombras se renderizaran en pasadas separadas, el número de caras frontales y traseras frente a un objeto se puede contar usando el búfer de estarcido. Si la superficie de un objeto está en sombra, habrá más superficies de sombra orientadas al 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 sombras. La generación de la máscara de la plantilla funciona de la siguiente manera:

  1. Desactive las escrituras en los búferes de profundidad y color.
  2. Utilice la eliminación de la cara posterior .
  3. Configure la operación de la plantilla para que se incremente en el pase de profundidad (solo cuente las sombras frente al objeto).
  4. Renderice los volúmenes de sombra (debido a la selección selectiva, solo se renderizan sus caras frontales).
  5. Utilice el sacrificio de cara frontal.
  6. Configure la operación de la plantilla para que disminuya en el pase de profundidad.
  7. Renderice los volúmenes de sombra (solo se renderizan sus caras posteriores).

Una vez logrado esto, todas las superficies iluminadas corresponderán a un 0 en el búfer de la plantilla, donde el número de superficies frontal y posterior de todos los volúmenes de sombra entre el ojo y esa superficie es igual.

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 cualquier otra cosa, y esto agrega un sesgo de -1 a todo el búfer de la plantilla, invirtiendo efectivamente las sombras. Esto se puede remediar 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 a la sombra de un volumen emitido por un objeto detrás de la cámara, que también debe taparse de alguna manera para evitar un problema similar. En la mayoría de las implementaciones comunes, debido a que la limitación adecuada para el pase de profundidad puede ser difícil de lograr, el método de falla de profundidad (ver más abajo) puede tener licencia para estas situaciones especiales. Alternativamente, se puede darle al búfer de la plantilla un sesgo +1 por cada volumen de sombra en el que se encuentra la cámara, aunque la detección puede ser lenta.

Existe otro problema potencial si el búfer de la plantilla no tiene suficientes bits para acomodar el número de sombras visibles entre el ojo y la superficie del objeto, porque utiliza aritmética de saturación . (Si usaran el desbordamiento aritmético en su lugar, el problema sería insignificante).

La prueba de paso de profundidad también se conoce como prueba de paso z , ya que el búfer de profundidad a menudo se denomina búfer z.

Fallo de profundidad [ editar ]

Alrededor del año 2000, varias personas descubrieron que se puede hacer que el método de Heidmann funcione para todas las posiciones de la cámara invirtiendo la profundidad. En lugar de contar las superficies de sombra frente a 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 no se cuentan los volúmenes de sombra entre el ojo y el objeto, pero introduce la condición de que la parte trasera del volumen de la sombra debe estar tapada, o las sombras terminarán faltando donde apunta el volumen. hacia atrás hasta el infinito.

  1. Desactive las escrituras en los búferes de profundidad y color.
  2. Utilice el sacrificio de cara frontal.
  3. Configure la operación de la plantilla para que se incremente en caso de falla de profundidad (solo cuente las sombras detrás del objeto).
  4. Renderiza los volúmenes de sombra.
  5. Utilice la eliminación de la cara posterior.
  6. Configure la operación de la plantilla para que disminuya en caso de falla de profundidad.
  7. Renderiza los volúmenes de sombra.

El método de falla de profundidad tiene las mismas consideraciones con respecto a la precisión del búfer de esténcil que el método de pasada de profundidad. Además, de forma similar a la pasada de profundidad, a veces se le denomina método z-fail .

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 en GDC en marzo de 1999 y 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, US 6384822  , titulada "Método para renderizar sombras usando un volumen de sombra y un búfer de plantilla" emitida en 2002 y que expiró en octubre de 2019. John Carmack de id Software descubrió de forma independiente el algoritmo en 2000 durante el desarrollo deDoom 3 . [5]

Exclusivo-o [ editar ]

Cualquiera de los tipos anteriores se puede aproximar con una variación exclusiva-o , que no se ocupa adecuadamente de los volúmenes de sombra que se cruzan, pero guarda una pasada de renderizado (si no el tiempo de relleno) y solo requiere un búfer de plantilla de 1 bit. Los siguientes pasos son para la versión de pase de profundidad:

  1. Desactive las escrituras en los búferes de profundidad y color.
  2. Establezca la operación de la plantilla en XOR en el pase de profundidad (voltee en cualquier superficie de sombra).
  3. Renderiza los volúmenes de sombra.

Optimización [ editar ]

  • Un método para acelerar los cálculos de la geometría del volumen de sombra es utilizar partes existentes de la tubería de renderizado para hacer algunos de los cálculos. Por ejemplo, al usar coordenadas homogéneas , la coordenada w puede establecerse en cero para extender un punto hasta el infinito. Esto debe ir acompañado de un tronco de visualización que tenga un plano de recorte lejano que se extienda hasta el infinito para acomodar esos puntos, lo que 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. Consulte el documento de 2002 "Volúmenes de sombra con estarcido prácticos y robustos para el renderizado acelerado por hardware" , 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 tijera en el hardware para limitar las sombras a un rectángulo específico en pantalla.
  • NVIDIA ha implementado una capacidad de hardware llamada prueba de límites de profundidad que está diseñada para eliminar partes de los volúmenes de sombra que no afectan la escena visible. (Esto ha estado disponible desde el modelo GeForce FX 5900). Una discusión sobre esta capacidad y su uso con volúmenes de sombra se presentó en la Game Developers Conference en 2005. [6]
  • Dado que el método de falla en profundidad solo ofrece una ventaja sobre el pase de profundidad en el caso especial en el que el ojo está dentro de un volumen de sombra, es preferible verificar este caso y utilizar el paso de profundidad siempre que sea posible. Esto evita tanto el back-tapping innecesario (y la rasterización asociada) para los casos donde el fallo de profundidad es innecesario, como también el problema de un taponamiento frontal apropiado para casos especiales de paso de profundidad [ cita requerida ] .
  • En las canalizaciones de GPU más recientes, se pueden usar sombreadores de geometría para generar los volúmenes de sombra. [7] [8]
  • En los sistemas que no admiten sombreadores de geometría, los sombreadores de vértices también se pueden utilizar para crear volúmenes de sombra mediante la extrusión selectiva de vértices que ya residen en la memoria de la GPU. [9]

Ver también [ editar ]

  • Borde de silueta
  • Mapeo de sombras , un algoritmo de sombreado alternativo
  • Tampón de plantilla
  • Búfer de profundidad
  • Lista de patentes de software

Referencias [ editar ]

  1. ^ Cuervo, Franklin C: " Algoritmos de sombra para gráficos por computadora ", Gráficos por computadora (Actas de SIGGRAPH '77) , vol. 11, no. 2, 242-248.
  2. Yen, Hun (3 de diciembre de 2002). "La teoría de los volúmenes de sombra de la plantilla" . GameDev.net . Consultado el 12 de septiembre de 2010 . CS1 maint: parámetro desalentado ( enlace )
  3. ^ "¿Stencil Shadows patentado? ¡WTF! - GameDev.net" . 2004-07-29 . Consultado el 28 de marzo de 2012 . CS1 maint: parámetro desalentado ( enlace )
  4. ^ "Creative patents Carmack's reverse" . El informe técnico. 2004-07-29 . Consultado el 12 de septiembre de 2010 . CS1 maint: parámetro desalentado ( enlace )
  5. ^ Kilgard, Mark; John Carmack. "John Carmack sobre volúmenes de sombra ..." Página práctica y robusta de volúmenes de sombra de NVIDIA Developer Zone . archive.org: NVIDIA. Archivado desde el original el 27 de enero de 2009 . Consultado el 18 de octubre de 2012 . CS1 maint: discouraged parameter (link) CS1 maint: unfit URL (link)
  6. ^ Lengyel, Eric. "Renderizado avanzado de la sombra de la plantilla y de la cuña penumbral" (PDF) . Conferencia de desarrolladores de juegos 2005 . 2005 . Consultado el 18 de octubre de 2012 . CS1 maint: discouraged parameter (link)
  7. ^ https://web.archive.org/web/20110516024500/http://developer.nvidia.com/node/168
  8. ^ Stich, Martin; Carsten Wächter; Alexander Keller (2007). "Capítulo 11" Volúmenes de sombra eficientes y robustos utilizando sombreadores de geometría y eliminación de oclusión jerárquica " " . Gemas de GPU 3 . archive.org: nVidia / Addison-Wesley. Archivado desde el original el 16 de mayo de 2011 . Consultado el 18 de octubre de 2012 . CS1 maint: discouraged parameter (link) CS1 maint: unfit URL (link)
  9. ^ Brennan, Chris. "Extrusión de volumen de sombra utilizando un sombreador de vértices" (PDF) . AMD . Consultado el 14 de febrero de 2018 .

Enlaces externos [ editar ]

  • La teoría de los volúmenes de sombra de la plantilla
  • La mecánica de las sólidas sombras de estarcido
  • Introducción a los volúmenes de sombras de esténcil
  • Mapeo de sombras y volúmenes de sombras
  • Volúmenes de sombra estarcidos en OpenGL
  • Tutorial de sombra de volumen [ enlace muerto ]
  • Volúmenes de sombra rápidos en NVIDIA
  • Volúmenes robustos de sombra en NVIDIA
  • Renderizado avanzado de sombra de plantilla y cuña penumbral
  • Sombras suaves realistas de Penumbra-Wedges Blending
  • Volumen de sombra de textura suave
  • Corregir los volúmenes de sombras de la plantilla Z-Pass

Con respecto a las patentes de falla en profundidad [ editar ]

  • "Software de identificación de presiones creativas con patentes" . Slashdot . 28 de julio de 2004 . Consultado el 16 de mayo de 2006 . CS1 maint: discouraged parameter (link)
  • "Creative patents Carmack's reverse" . El informe técnico . 29 de julio de 2004 . Consultado el 16 de mayo de 2006 . CS1 maint: discouraged parameter (link)
  • "Creative da trasfondo a la historia de sombras de Doom III" . El indagador . 29 de julio de 2004 . Consultado el 16 de mayo de 2006 . CS1 maint: discouraged parameter (link)