Manejo de alias proyectivo en mapeo de sombras

15

Estoy jugando con el modelado 3D de procedimiento simple para hacer pequeños edificios para la impresión 3D. Un ejemplo:

El edificio


Para hacer que los modelos sean más legibles en pantalla, he implementado el mapeo básico de sombras para una sola luz direccional. Como mi escena no está cambiando, solo renderizo el mapa de sombras una vez usando un cuadro alineado de eje de la escena para descubrir cuáles deberían ser los límites del mapa de sombras. Las sombras y los límites parecen tener todas las matrices correctas, pero acercarse un poco se ve terrible:

Primer plano de la torre

Por la lectura que hice, entiendo el peter panning y lo que podría hacer al respecto, pero los bordes irregulares, que creo que son una forma de alias proyectivo, se ven tan mal que creo que algo está mal en mi implementación básica.

Pirateé el sombreador de píxeles para mostrar los límites del texel de sombra:

Mostrando los límites de Texel

Tengo filtrado bilineal en la textura (sin él, tengo un acné sombra grave). Lamentablemente, mi intento de PCF también falló; parece igual de irregular:

ingrese la descripción de la imagen aquí

Aquí está el caso de muestra única con filtrado bilineal deshabilitado:

ingrese la descripción de la imagen aquí

¿Parece esto un alias proyectivo "típico"? ¿Podría la representación dinámica del mapa de sombras, usando el frustum de vista recortado a la escena, posiblemente en cascada, abordar el problema?

Editar: Agregar un primer plano de filtrado bilineal, comparación de sombra posterior, solo para mostrar lo que obtengo. El acné de sombra malo aparece debido a los bordes interiores; Estoy modelando con bloques virtuales apilados y no estoy haciendo una operación de unión adecuada. Según mi lectura, implementar operaciones booleanas en poliedros no es trivial, pero también me permitirá implementar volúmenes de sombra estáticos, así como limpiar algunos programas de impresión 3D.

Filtrado Bilineal

Daniel M Gessel
fuente

Respuestas:

10

El mapeo de sombras con una calidad aceptable es todo un viaje. Así que implementó el primer paso: un mapa de sombras básico que abarca estáticamente toda la escena. Esto significa que el tamaño de texel del mapa de sombras en el espacio de vista claro con el tamaño de texel de la escena renderizada en la relación de espacio de vista de la cámara es bastante grande, lo que resulta en alias. Para reducir esta proporción más cerca de 1: 1, existen técnicas que mencionó como:

  • la forma más fácil es aumentar el tamaño de su mapa de sombras, para encontrar el valor con un rendimiento aún óptimo,
  • alinee el mapa de sombra con el frustum de la vista de cámara. Luego, el mapa de sombras abarca una parte más pequeña de la escena, por lo que reduce el alias,
  • Esto se puede mejorar a CSM, que hace lo mismo, pero debe renderizar la escena para cada cascada con una posición central diferente de la matriz de vista de luz en función del punto central de cada corte de frustum.

Algunas de las técnicas básicas para suavizar el borde de la sombra:

  • obviamente PCF, pero se recomienda combinar su implementación PCF con PCF de hardware incorporado (en Opengl - usando sampler2DShadow). Esto resultaría en menos iteraciones de bucle de su lado y PCF más barato,
  • El bloqueo de los bordes se puede cambiar por ruido utilizando el disco de Poisson girado. Las muestras utilizadas para muestrear del mapa de sombras se rotan aleatoriamente con cada iteración del bucle PCF.

También puede investigar las técnicas de suavizado de bordes como:

  • renderizar el mapa de sombra al framebuffer aplicado por MSAA,
  • mejorando aún más la PCF por interpolación ,
  • Número creciente de muestras con mezcla temporal .

La técnica básica de PCF sufre de acné en la sombra que se puede solucionar mediante la aplicación de algún desplazamiento en la prueba de sombra. Calcular el tamaño de este desplazamiento también es un área de investigación .

Otros métodos de mapas de sombras más avanzados incluyen:

  • Mapas de sombras exponenciales y mapas de sombras de varianza : en la mayoría de los casos no sufren de acné en las sombras y ofrecen bordes suaves sin bloqueos, pero a costa de algunas situaciones de fugas de luz,
  • Mapas de sombras de varianza exponencial: probablemente la técnica más avanzada del mapeo de sombras de mapas de profundidad 2D, combina una gran suavidad de VSM y resuelve las fugas de luz, a un costo de duplicación del uso de memoria,
  • Porcentaje de sombras suaves más cercanas : técnica básica para mejorar los mapas de sombras tradicionales con diferentes tamaños de penumbra,
  • Mapas de sombras de vista múltiple: mapas de sombras múltiples de alguna técnica, dispuestos en luz de área, para calcular sombras suaves realistas con diferentes tamaños de penumbra,
  • Mapas de sombras profundas : para mejorar la dispersión volumétrica con sombras,
  • Rayos trazados en tiempo real, probablemente el futuro.

No fallaste con PCF, se ve así :)

Desearía que hubiera una manera de aplicar el desenfoque gaussiano en el mapa de sombras en el espacio de visualización de la cámara, pero no funciona como se esperaba.

narthex
fuente
Parte de este comentario es agradecerte por tu respuesta, así que pensé en avisarte ya que no recibirás una notificación desde allí.
trichoplax
Sí, lo vi pero gracias.
narthex
1

Usted ha dicho que "... filtrado bilineal en la textura ...". Parece que estás interpolando los valores de profundidad del mapa de sombras. La forma correcta de usar la interpolación con el mapa de sombras es aplicarla sobre los resultados de las pruebas de sombra (hasta donde recuerdo, OpenGL lo admite). Incluso podría combinar la interpolación de los resultados de las pruebas paralelas con PCF, que ofrecerá resultados mucho mejores. Sin embargo, como habrás notado, el alias es una plaga que siempre persigue el mapeo de sombras :)

Aunque entiendo que está buscando soluciones con respecto al mapeo de sombras (incluso porque es bastante simple de implementar), ¿alguna vez ha considerado el uso de volúmenes de sombra? Es mucho más complejo de implementar, pero no sufre de alias en absoluto, y creo que encajaría muy bien con sus propósitos.

Christian Pagot
fuente
Muchas gracias por las respuestas! Para obtener los resultados que estoy buscando, podría ser apropiado cambiar a volúmenes de sombra. El enlace de flujo de código proporcionado bajo "interpolación" es muy útil, ¡gracias!
Daniel M Gessel