Em uma pergunta anterior , sugeriu-se que os campos de distância assinados possam ser pré-computados, carregados em tempo de execução e usados a partir daí.
Por razões que explicarei no final desta pergunta (para pessoas interessadas), preciso criar os campos de distância em tempo real.
Existem alguns documentos disponíveis para diferentes métodos que deveriam ser viáveis em ambientes de tempo real, como métodos para transformações à distância de chanfro e transformações baseadas em aproximação de diagrama de Voronoi (conforme sugerido nesta apresentação pelo desenvolvedor Pixeljunk Shooter ), mas Eu (e, portanto, pode-se supor que muitas outras pessoas) têm muita dificuldade em realmente usá-las, uma vez que geralmente são longas, inchadas em grande parte com matemática e não muito algorítmicas em suas explicações.
Qual algoritmo você sugeriria para criar os campos de distância em tempo real (favoravelmente na GPU), especialmente considerando a qualidade resultante dos campos de distância?
Como estou procurando uma explicação / tutorial real, em vez de um link para apenas outro artigo ou slide, essa pergunta receberá uma recompensa assim que for elegível para uma :-).
Aqui está o porquê eu preciso fazer isso em tempo real:
Se você precisar precomputar esses SDFs para grandes ambientes 2D (pense em um mapa grande como Terraria), isso significa que você está aceitando uma sobrecarga bastante grande no espaço de armazenamento (e no tempo de geração do mapa) em favor da implementação de um algoritmo complicado, rápido o suficiente para gerar SDF em tempo real.
Por exemplo, um mapa relativamente pequeno com 1000 * 256 (largura * altura) com um tamanho de bloco de 10 * 10 pixels e, portanto, dimensões totais de 10000 * 2560 pixels já custaria cerca de 2 megabytes de tamanho, se você escolher um tamanho relativamente pequeno Resolução SDF de 128x128, supondo que você esteja armazenando apenas os valores de distância de 0 a 255.
Obviamente, isso pode se tornar rapidamente demais e é uma sobrecarga que eu não quero ter.
Há algo mais:
Os SDFs podem ser usados para muitas coisas (como detecção de colisão), e alguns aplicativos úteis ainda não foram descobertos. Eu acho que muitas pessoas vão procurar essas coisas no futuro, e se tivermos uma resposta abrangente aqui, acho que vamos ajudar muitas pessoas.
fonte
Respostas:
Catalin Zima explica como obter sombras 2D dinâmicas em seu artigo - e ele usa um campo de distância assinado (pelo que posso dizer que é apenas um nome sofisticado para um buffer de sombras neste contexto). Seu método precisa de uma GPU, e sua implementação como está não é a melhor (a sua caiu abaixo de 60Hz a cerca de 20 luzes na minha máquina, a minha tem cerca de 500 luzes); o que é esperado, já que ele favoreceu a clareza do código sobre a velocidade.
Implementação
Exatamente como implementado por ele:
Minha implementação final foi (cada etapa sendo um único sombreador):
É bastante engenhoso: é basicamente uma tradução direta de como as sombras são manipuladas em 3D para 2D.
Armadilhas
A principal armadilha é que alguns objetos não devem ser sombreados: no meu exemplo, eu estava escrevendo um clone do Liero (worms em tempo real) e, portanto, não queria, por exemplo, que os worms dos jogadores fossem sombreados (pelo menos aquele na tela de cada jogador). Tudo o que fiz para esses objetos 'especiais' foi redesenha-los como um último passo. A ironia era que a maioria dos objetos não era sombreada (worms, primeiro plano da paisagem), então há um problema de excesso de dados aqui.
fonte