stringtranslate.com

Volumen de sombra

Ejemplo de sombreado de 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 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.

Construcció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:

  1. Encuentre 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 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 sombras. La imagen de arriba a la izquierda muestra una escena sombreada usando volúmenes de sombra. A la derecha, los volúmenes de las sombras 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 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:

  1. Renderiza la escena como si estuviera completamente en sombras.
  2. Para cada fuente de luz:
    1. Usando la información de profundidad de esa escena, construya una máscara en el buffer de la plantilla 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 buffer de plantilla para enmascarar las áreas sombreadas. Utilice una combinación aditiva para agregar este renderizado a la escena.

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.

pase de profundidad

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:

  1. Deshabilite las escrituras en los buffers de profundidad y color.
  2. Utilice el sacrificio de la cara posterior .
  3. Configure la operación de la plantilla para que incremente al pasar en profundidad (solo cuente las sombras delante del objeto).
  4. Renderice los volúmenes de sombras (debido a la selección, solo se renderizan sus caras frontales).
  5. Utilice el sacrificio de la cara frontal.
  6. Configure la operación de la plantilla para que disminuya en la pasada de profundidad.
  7. Renderiza los volúmenes de sombras (solo se renderizan sus caras posteriores).

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.

Fallo de profundidad

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.

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

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]

Exclusivo o

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:

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

Mejoramiento

Ver también

Referencias

  1. ^ Crow, Franklin C: "Algoritmos de sombra para gráficos por computadora", Computer Graphics (Actas de SIGGRAPH '77) , vol. 11, núm. 2, 242–248.
  2. ^ Yen, hun (3 de diciembre de 2002). "La teoría de los volúmenes de sombras de esténcil". GameDev.net . Consultado el 12 de septiembre de 2010 .
  3. ^ "¿¡Stencil Shadows patentado !? ¡WTF! - GameDev.net". 2004-07-29 . Consultado el 28 de marzo de 2012 .
  4. ^ "Patentes creativas al revés de Carmack". El informe técnico. 2004-07-29. Archivado desde el original el 31 de enero de 2010 . Consultado el 12 de septiembre de 2010 .
  5. ^ US 6384822, Bilodeau, William & Songy, Michael, "Método para representar sombras utilizando un volumen de sombra y un búfer de plantilla", publicado el 7 de mayo de 2002, asignado a Creative Technology Ltd. 
  6. ^ Kilgard, Mark; Juan Carmack. "John Carmack sobre volúmenes ocultos..." Página práctica y robusta de volúmenes ocultos de NVIDIA Developer Zone . archive.org: NVIDIA. Archivado desde el original el 27 de enero de 2009 . Consultado el 18 de octubre de 2012 .
  7. ^ Lengyel, Eric. "Representación avanzada de sombra de plantilla y cuña penumbral" (PDF) . Conferencia de desarrolladores de juegos 2005 . 2005 . Consultado el 18 de octubre de 2012 .
  8. ^ "GPU Gems 3: Capítulo 11. Volúmenes de sombras eficientes y robustos utilizando sombreadores de geometría y selección de oclusión jerárquica | Zona de desarrolladores de NVIDIA". desarrollador.nvidia.com . Archivado desde el original el 16 de mayo de 2011 . Consultado el 12 de enero de 2022 .
  9. ^ Stich, Martín; Carsten Wächter; Alejandro Keller (2007). "Capítulo 11" Volúmenes de sombras eficientes y robustos utilizando sombreadores de geometría y selección de oclusión jerárquica"". Gemas GPU 3 . archive.org: nVidia / Addison-Wesley. Archivado desde el original el 16 de mayo de 2011 . Consultado el 18 de octubre de 2012 .
  10. ^ Brennan, Chris. "Extrusión de volumen de sombra utilizando un Vertex Shader" (PDF) . AMD . Consultado el 14 de febrero de 2018 .