Como crio vários holofotes 2D?

12

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

Efeito Spotlight com um spotlight

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

Efeito Spotlight com dois holofotes

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)

Abordagem de transparência

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:

Sobreposição de dois círculos de transparência

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:

Máscara de transparência

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)

Máscara de transparência com transparência

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:

Duas máscaras de transparência com transparência

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.

Cameron Fredman
fonte
Pensando nisso, parece que eu deveria mover as máscaras de transparência e aplicá-las a uma grande textura preta. Não faço ideia de como isso seria feito.
Cameron Fredman #
7
Não tenho certeza de como você está criando ou aplicando seus gradientes, no entanto, isso pode ser um problema de mistura, onde se você usar a mistura certa, ela funcionará bem. Nós precisaríamos de mais informações sobre as texturas.
dennmat
Estou usando o AndEngine como estrutura e grande parte da mistura está acontecendo nos bastidores, embora exista um "setBlendFunction ()" disponível.
Cameron Fredman #
Olhando para o que você vinculou, eu diria que você provavelmente deseja a segunda solução listada na parte inferior ou a terceira, se isso não funcionar. Eu não sou claro no andEngine, e eles não parecem ter documentos, talvez se você não encontrar sua resposta nesse tópico, eles possam ajudar ainda mais, pois parece que eles já estão brincando com a mistura opções nos bastidores.
Dennmat
Embora esse segmento pareça estar corrigindo seu problema, você tem a versão que inclui essa alteração?
dennmat

Respostas:

3

Conceitualmente, a solução para vários focos consiste em:

  1. Comece com uma matriz completamente preta para manter os valores de iluminação para cada pixel na cena.
    • Zero representa uma área da imagem sem luz alguma.
    • 100% representará uma área completamente saturada com a luz do dia.
    • Se você quiser ser extravagante, um valor superior a 100% (por exemplo, 200%) representa uma área da imagem super saturada e transforma tudo em um blob branco ofegante de pixels. Preocupe-se com isso mais tarde, e simplesmente limite valores entre 0-100% por enquanto.
  2. Para cada fonte de luz dentro da tela ou suficientemente próxima da borda que seu halo adicionaria à luz, adicione os valores dessa fonte à sua matriz de valores de luz para os pixels da cena.
  3. Use a matriz do valor da luz resultante para modificar os pixels da sua cena, de modo que:
    • Os pixels acesos com 0% de luz são pretos.
    • Os pixels acesos com 100% de luz estão na cor normal.
    • Outros pixels são uma cor intermediária.
    • Parece que você já sabe como executar esta etapa, a julgar pelas capturas de tela.

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:

  • Adicionando valores alfa a cada pixel, para criar a matriz de valores de luz a partir de # 1.
  • Usando a matriz do valor da luz nº 1 para resolver as cores finais dos pixels da etapa nº 3.

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.

ET
fonte
Estou procurando esta resposta e vou tentar. A idéia de um reflexo / desfocagem da lente para valores acima de 100% também é um bônus agradável e inspirador. Publicará atualizações com as lições aprendidas no processo. Obrigado ET
Cameron Fredman