Estou escrevendo um pequeno mecanismo isométrico 2D em C ++ e estou tentando implementar a projeção de sombras em tempo real. Eu segui uma abordagem simples descrita nesta página e aqui está o resultado (a luz está localizada na mesma posição que o cubo amarelo):
O resultado é muito bom, mas faltam sombras nas paredes e no topo dos cubos. Aqui está um exemplo de como deve ser (desenhei as sombras esperadas em verde):
Todos os cubos desenhados são feitos simplesmente de 3 quadríceps 2D, localizados na posição XY e com uma profundidade Z (z = x + y). Eu uso o OpenGL com uma matriz ortográfica (glOrtho). As sombras são desenhadas usando o buffer de estêncil.
Estou procurando recursos ou soluções que me ajudem a concluir essa implementação de sombra projetada.
Muito obrigado!
Respostas:
Para telhado e paredes, você pode tentar determinar interseções entre os segmentos da parede e as regiões de sombras geradas. Você precisa de duas passagens de renderização de suas sombras. Primeiro, você fará o que está fazendo hoje (no armazenamento de memória). O segundo passe calcula as interseções do telhado e da parede. O último estágio é a renderização real. DeadMG está errado, você pode fazer isso.
Nota: para o telhado, é necessário cruzar a área de sombra e a área do telhado.
fonte
Fundamentalmente, o que você está procurando não pode ser feito. Você quer pegar vários objetos 2D e fazê-los projetar sombras como se fossem objetos 3D. Se você quiser ter sombras 3D completas, precisará ter objetos 3D.
fonte
A solução descrita não é 3D completa, pois ele não precisa de uma solução 3D completa. Vai parecer, mas não é. A criação da projeção de sombra deve ser considerada como interseção entre o volume. O que ele precisa é menos complicado. Lembre-se (se você tiver) de dooms e deoms como o mecanismo de renderização. Todo o processamento foi realizado em duas dimensões.
fonte
Como você deseja que este jogo seja pequeno, que tal dizer que a atual implementação de sombra é boa o suficiente?
Admito que não vi isso em ação, ou seja, não vi quão perturbadoras ou não perturbadoras serão as imperfeições das sombras quando este jogo estiver sendo executado ao vivo com objetos dinâmicos e fontes de luz dinâmicas, mas julgar pelas suas imagens, eu ' Estou muito tentado a dizer "é bom o suficiente, agora concentre-se em concluir o jogo". Se a implementação atual for pequena e executar rapidamente, e corrigir o que você considera problemas tornará o código grande e lento, acho melhor você não se preocupar com essas sombras.
Eu sei, eu sei, sugerir "não tente resolver o problema", pois uma solução para um problema pode ser uma prática ruim. Ainda assim, sinceramente, quero dizer que realmente é bom se você deseja uma pequena pegada no seu código.
fonte