Artefactos del mapa de sombras

16

Quiero intentar agregar sombras a un juego 3D XNA. He configurado un entorno de prueba con una luz y una cámara. Sin embargo, me encuentro con artefactos con mi enfoque.

Estoy usando el código de sombreador de http://pastebin.com/zXi0hmsU para representar el resultado final y http://pastebin.com/rY4Gcj9N para crear los mapas de sombras. El código es bastante sencillo e implica la producción del mapa de profundidad desde el punto de vista de la luz, luego proyectándolo en el espacio de la cámara y buscando oclusiones.

Sin embargo, desde la mayoría de los ángulos estoy obteniendo resultados bastante feoscomo en esta captura de pantalla

La escena consta de algunos cubos simples (construidos a mano, mirando hacia afuera, la cara posterior está seleccionada), una luz (el mapa de sombras se muestra en la esquina superior izquierda, se ve bien) y una cámara.

Mi RenderTarget para los mapas de sombras se inicializa por

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Posteriormente, CreateShadowMapse aplica el efecto, seguido del efecto LambertWithShadows. Finalmente, el mapa de sombras se dibuja usando a SpriteBatch.

El resto del código consiste simplemente en proporcionar los valores correctos a los sombreadores. Si es necesario, puedo proporcionarlo bien.

Etan
fuente

Respuestas:

19

Este es un problema típico llamado acné del mapa de sombras . Se debe a que el píxel proyectado del mapa de sombras (profundidad) es mayor que el píxel en la pantalla (la ecuación no puede representar la profundidad correctamente).

ingrese la descripción de la imagen aquí

Hay muchas soluciones para esto. Primero, lo más fácil es el sesgo (lo veo en su código, por lo que ese no es el problema). Y la segunda solución fácil es el mapa de sombras en una resolución más grande, es realmente más que típico tener mapas de sombras en la resolución 2048x2048 en hw actual. (EDITAR: eso no es cierto, lo escribí cuando estaba trabajando en la representación de películas. En el desarrollo del juego, quieres mantener tu mapa de sombras lo más pequeño posible)

Algunos recursos para estudiar técnicas más avanzadas.


editar:

Notabene
fuente
Tengo algunos materiales más sobre este tema en el trabajo, si está interesado, también lo compartiré.
Notabene
El principal problema con las grandes resoluciones es que al final del juego tengo unas 3-4 luces que no están dirigidas => Tendré que usar mapas de sombras cúbicos allí, lo que da como resultado 24 mapas de sombras. Si tiene materiales adicionales, realmente agradecería su esfuerzo de compartirlo conmigo :-)
Etan
Estoy interesado al menos si eso importa :)
James
1
@Etan. Sí, las luces omnidireccionales son un verdadero dolor si hablan de sombras. (Sé algo al respecto :) gamedev.stackexchange.com/questions/6203/… ). Intenta usar mapas paraboloides duales. O si le gustan los mapas de cubos, intente ahorrar espacio frotando la intersección frustum-camera_frustum para cada cara / render. Probablemente no necesitará sombra para todas las direcciones todo el tiempo (especialmente en exteriores)
Notabene
1
@Etan @James Agregué algunas cosas más para ti. Vale la pena leer ambos si está interesado en este tema.
Notabene