Estou procurando criar um efeito "spotlight" em 2D que permita um spotlight em várias entidades. Ou seja, como se vários sprites estivessem segurando tochas. Para uma única entidade (um foco), uso uma técnica em que sobreponho um sprite de gradiente e o ponto central persegue essa entidade. Essa técnica funciona bem para um único holofote. Aqui está uma captura de tela para ilustrar o que estou falando:
Destaque único - Trabalhos
O problema que encontro é que essa técnica não se estende a várias entidades. Se sobrepor outra imagem de destaque, encontro vários problemas. Aqui está uma captura de tela simulada:
Vários focos = problemas
O problema mais óbvio são os cantos visíveis. Isso poderia ser resolvido tornando a imagem do holofote gigantesca para cobrir todo o nível, mas isso não parece certo. O segundo e mais intratável problema é que estou multiplicando efetivamente a escuridão com esta técnica. Portanto, cada sprite adicionado tem o efeito de escurecer todos os outros. Claramente, estou abordando esse problema incorretamente.
Alguma ideia?
Esforços contínuos
Houve alguma discussão sobre opções de mistura nos comentários. Aqui está o meu pensamento atual. No meu exemplo único de destaque acima, uso um arquivo de imagem parecido com o seguinte: (Substituí a transparência pela cor verde para facilitar a ilustração)
Como discutido acima, o problema é que o alfa, misturando esta imagem com outra imagem, não produzirá o efeito desejado. Em vez disso, produzirá o seguinte:
Isso não me parece uma questão de opções combinadas. O problema, parece-me, é que esse tipo de imagem possui a máscara de transparência e a imagem (um quadrado preto) incorporada, quando devem ser separadas.
Portanto, em vez de uma imagem em preto com uma transparência recortada incorporada, eu deveria estar usando máscaras de transparência que são utilizadas em tempo de execução no quadrado preto. Ao fazer isso, ainda não consigo usar uma máscara de transparência branca e preta tradicional ou ela terá o mesmo problema. Aqui está um exemplo, desta vez o branco e o preto representam branco e preto:
A solução, ao que parece, seria aplicar uma máscara de transparência que ela própria utiliza transparência. Algo assim: (verde = transparente)
Dessa forma, várias máscaras de transparência podem ser combinadas em alfa e ENTÃO usadas como uma máscara de transparência contra o quadrado preto. Aqui está um exemplo de duas das máscaras de transparência alfa combinadas:
Enfim, essa é a abordagem que estou trabalhando para implementar. Vou postar resultados se isso funcionar. O que eu não sei (no momento) é se eu posso usar uma máscara de transparência que por si só tenha transparência.
Respostas:
Conceitualmente, a solução para vários focos consiste em:
O truque é entender que a mistura alfa pode executar uma ou mais dessas etapas. A mistura alfa refere-se apenas ao uso de um mapa / imagem alfa para modificar os pixels de uma imagem ou textura de uma maneira simples. Também geralmente significa que será um conjunto rápido de funções, ou implementado com comandos especiais de hardware, para torná-lo rápido. Você pode fazer isso com matrizes regulares e comandos de idioma normal, mas o uso das funções especiais da biblioteca alfa / blending é provavelmente melhor. ... E não terá bugs. Às vezes, isso significa tornar os pixels parcialmente transparentes, mas para o seu caso, isso significa:
Eu começaria a procurar na documentação suas funções de mistura alfa para ver qual funcionalidade elas fornecem para combinar pixels de vários tipos. Eu suspeito que eles terão funções para cada uma das etapas que você precisará executar, mas elas podem estar sob nomes que não são óbvios.
fonte