Como implemento sombras 2D projetadas entre camadas?

10

Como eu poderia implementar sombras 2D que são projetadas por objetos em uma camada diferente?

NÃO goste da iluminação dinâmica no conhecido tutorial de Catalin Zima :

insira a descrição da imagem aqui

Mas como as sombras dos canos neste vídeo :

insira a descrição da imagem aqui

E como a sombra da plataforma e o personagem neste vídeo :

insira a descrição da imagem aqui

Eu gostaria de usar o mesmo tipo de iluminação em uma cena com muitas camadas e muitas luzes com cores diferentes.

Eu poderia imaginar fazendo isso desenhando uma cópia preta da camada sobre as camadas atrás dela e ajustando-a de acordo com os buracos nas camadas nas quais a sombra é projetada. Mas espero que exista uma abordagem mais barata e baseada em pixel shader para isso.

baga
fonte

Respostas:

1

Isso pode ser feito com mascaramento. Existem várias maneiras de fazer isso.

Uma maneira seria ter uma maneira de renderizar uma versão sombria dos elementos de primeiro plano. Desenhe o plano de fundo. Em seguida, desenhe os elementos do primeiro plano, desloque um pouco, dependendo de como você deseja que a iluminação se mova, de forma que você produz apenas cores pretas. Em seguida, desenhe o primeiro plano normalmente.

Outra maneira seria renderizar o primeiro plano em um buffer, um pouco mais do que você realmente veria. Em seguida, faça um passe "preto" e talvez um desfoque. Agora renderize a saída desse conjunto de passes e a seção visível do buffer em primeiro plano.

Para suportar várias luzes em diferentes ângulos, você pode executar a etapa anterior várias vezes ou acumular todas elas em um único buffer. A matemática varia de acordo com o que você está tentando alcançar, mas um primeiro palpite sobre o que está acontecendo naquele primeiro vídeo é que eles apenas posicionam a luz contra a posição da câmera (centro da área visível) e em seguida, use esse vetor (em escala) para determinar como compensar as 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

As luzes que estão "mais próximas" da cena terão um fator de escala menor. Se você deseja várias profundidades, há algumas contas a serem trabalhadas por aí, coisas geométricas simples.

Sean Middleditch
fonte
Sim, isso é exatamente o que eu vim comigo. Não sabia o termo correto, pois estava mascarando. Mas eu esperava que talvez seria um algoritmo mais semelhante à forma como os volumes de sombra trabalhar no espaço 3D ..
Berry
Quando você projeta sombras sobre superfícies com furos, é necessário projetar a sombra residente sobre a camada atrás dessa. Além disso, trabalhar com transparência se tornará um pouco complicado. Eu já pensei em todas as soluções para esses problemas! Mas achei que seria muito caro aplicar em tempo real, principalmente quando lidamos com muitas camadas (20) e muitas luzes (50). É por isso que eu esperava uma abordagem diferente.
21750 Berry