¿Cómo implemento sombras 2D proyectadas entre capas?

10

¿Cómo podría implementar sombras 2D que son proyectadas por objetos en una capa diferente?

NO como la iluminación dinámica en el conocido tutorial de Catalin Zima :

ingrese la descripción de la imagen aquí

Pero como las sombras de las tuberías en este video :

ingrese la descripción de la imagen aquí

Y como la sombra de la plataforma y el personaje en este video :

ingrese la descripción de la imagen aquí

Me gustaría usar el mismo tipo de iluminación en una escena con muchas capas y muchas luces con diferentes colores.

Me imagino haciendo esto dibujando una copia negra de la capa sobre las capas detrás de esa capa y ajustándola de acuerdo con los agujeros en las capas sobre las que se proyecta la sombra. Pero espero que haya un enfoque basado en el sombreador de píxeles menos costoso para esto.

Baya
fuente

Respuestas:

1

Esto se puede hacer con enmascaramiento. Hay múltiples formas de hacerlo.

Una forma sería tener una forma de representar una versión sombreada de elementos en primer plano. Dibuja el fondo. Luego dibuje los elementos de primer plano, con un ligero desplazamiento dependiendo de cómo desee que se mueva la iluminación, de tal manera que solo genere colores negros. Luego dibuja el primer plano normalmente.

Otra forma sería convertir el primer plano en un búfer, un poco más de lo que realmente verías. Luego haga un pase "a negro" y quizás un pase borroso. Ahora renderice la salida de este conjunto de pasadas y luego la sección visible del búfer en primer plano.

Para admitir múltiples luces en diferentes ángulos, puede hacer el paso anterior varias veces o acumularlas todas en un solo búfer. Las matemáticas variarán según lo que intentes lograr, pero una primera suposición de lo que está sucediendo en ese primer video es que simplemente toman la posición de la luz contra la posición de la cámara (centro del área visible) y luego use ese vector (escalado) para determinar cómo compensar las sombras. Algo como:

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

Las luces que están "más cerca" de la escena tendrán un factor de escala menor. Si desea profundidades múltiples, hay algunas matemáticas para resolver, cosas geométricas simples.

Sean Middleditch
fuente
Sí, esto es exactamente lo que se me ocurrió. Sin embargo, no sabía el término correcto para enmascarar. Pero esperaba que tal vez hubiera un algoritmo más similar a cómo funcionan los volúmenes de sombra en el espacio 3D ...
Berry
Cuando proyecta sombras sobre superficies con agujeros en ellas, debe proyectar la sombra residente sobre la capa detrás de esa. Además, trabajar con transparencia se volverá un poco complicado. ¡Ya pensé en todas las soluciones para estos problemas! Pero pensé que sería demasiado costoso aplicarlo en tiempo real, especialmente cuando se trata de muchas capas (20) y muchas luces (50). Por eso esperaba un enfoque diferente.
Berry