Como posso obter um bom efeito de fogo com mistura alfa e partículas?

41

Usando a seguinte configuração para o efeito de partícula OpenGL:

SRC: GL_SRC_ALPHA
DST: GL_ONE

Cria uma mistura aditiva, que parece espetacular em um fundo preto, mas terrível em cores mais brilhantes, pois começa a desbotar para o branco.

Eu então usei a mistura alfa:

SRC: GL_SRC_ALPHA
DST: GL_ONE_MINUS_SRC_ALPHA

Isso permite que outros fundos sejam usados ​​sem afetar a cor das partículas, mas as próprias partículas parecem opacas em comparação com a mistura aditiva. Como posso obter um bom efeito de fogo com mistura alfa e partículas?

Aditivo:

Aditivo em preto Aditivo em azul

Alfa:

Alfa no preto Alfa em azul

ATUALIZAR:

Seguindo o conselho de David abaixo, criei uma textura separada e depois usei a mistura aditiva no efeito de partículas antes de desenhar na textura. O problema disso é que desenhar uma textura alfa = 0 resultou apenas nas partes coloridas da partícula aparecendo na frente do meu mapa do mundo, pois normalmente você tem um fundo preto. O truque era usar duas texturas. Eu criei uma textura preta e desenhei as partículas nela. Em seguida, removi a camada alfa das partículas dessa textura, removendo efetivamente todo o preto sólido ao redor e esmaecendo as partículas parcialmente visíveis, deixando o preto subjacente como seria de esperar ao criar partículas de mistura aditiva em um fundo preto. Em suma, um processo cansativo, mas cheguei lá eventualmente:

Aditivo regular e minha versão

Aqui está o tópico em que postei meu processo: http://www.cocos2d-iphone.org/forum/topic/28707?replies=8#post-141528

Vídeo: http://www.youtube.com/watch?v=JptGbEO3b5E

Aram Kocharyan
fonte

Respostas:

17

Admito que não estou ciente de nenhuma solução ideal para esse problema, portanto descreverei uma solução alternativa com a qual você pode ou não se sentir confortável:

  1. Renderize todas as partículas usando a mistura aditiva em uma textura separada (ou alvo de renderização) com o fundo limpo e transparente .
  2. Renderize essa textura (ou renderize o alvo) no topo da sua cena usando a mistura alfa .

Eu tentei no Photoshop e aqui está o que eu consegui - Não é perfeito, mas pelo menos preserva melhor as cores originais:

insira a descrição da imagem aqui

Aqui está a textura original sem fazer mistura aditiva nas partículas:

insira a descrição da imagem aqui

David Gouveia
fonte
Isso os separaria em duas texturas e seria como se eu tivesse uma textura da mistura aditiva sendo desenhada em um plano de fundo?
Aram Kocharyan
@AramKocharyan Na verdade, eu nunca tentei pessoalmente, exceto no Photoshop, onde os resultados pareciam razoáveis. Mas acho que deve parecer com sua primeira foto, mas com todos os pretos substituídos pela cor de fundo. Em outras palavras, as partículas são adicionadas, resultando em um grande destaque no meio da explosão, mas não no fundo. Em seguida, a explosão resultante é colada no topo do seu plano de fundo sem adicionar o que preserva a aparência original.
David Gouveia
Graças a isso, faz sentido, é como uma mistura normal no Photoshop versus uma sobreposição, mas aparece como a imagem de uma sobreposição sobre uma camada de fundo. Vou tentar e informar você.
Aram Kocharyan
@AramKocharyan Vou postar os resultados que obtive no photoshop em alguns minutos para que você possa comparar.
David Gouveia
5
Apenas jogando isso lá fora - esta técnica pode levantar questões de desempenho ...
notlesh
4

Como David Gouveia apontou, não há substituto satisfatório para a mistura de aditivos em fundos brilhantes. O melhor efeito que encontrei (que não requer algo como renderizar para um backbuffer) é usar o seguinte modo de mistura GL:

SRC: GL_ONE
DST: GL_ONE_MINUS_SRC_ALPHA

Não é tão bom quanto a mistura aditiva, mas muito melhor que isso GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. Se você ajustar um pouco os valores alfa e de cor inicial e final, poderá obter resultados realmente próximos da mistura aditiva.

modos de mistura de partículas

Na imagem acima, GL_SRC_ALPHA, GL_ONEà esquerda, no meio, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHAe à direita, você pode ver o modo de mesclagem que eu proporia para essa configuração.

bummzack
fonte
Concordo que, para o controle total da cor, esse método funciona muito bem.
Aram Kocharyan
Apenas para observar, notei que, com esse método, a melhor maneira de apagar o fogo era reduzi-lo ao tamanho zero, pois diminuir o alfa faz com que ele desapareça em branco.
Aram Kocharyan
3

Você já tentou usar os dois? Aplique camadas de algumas partículas com mistura alfa, que devem ter as cores do jeito que você deseja, depois volte com algumas combinações aditivas para obter o melhor destaque que você está procurando.

entalhe
fonte
Essa pode ser a minha próxima opção, porém, quero manter as partículas no mínimo. Espero que eu possa metade dos dois.
Aram Kocharyan
3

Bem, primeiro, as imagens de partículas que você está usando parecem ter um fundo preto, resultando nas franjas escuras da segunda imagem. Não faça isso; isto é, não desenhe a forma da partícula nos canais de cores. Em vez disso, a imagem deve ser solidamente colorida e definir apenas a forma no canal alfa.

Isso melhorará consideravelmente a aparência da transparência alfa. Em seguida, você pode melhorar ainda mais a aparência do efeito geral, fazendo com que as partículas mudem de cor ao longo da vida útil. Assim, a imagem base é muito clara, fornecendo a área central amarela brilhante. Em seguida, tinja as partículas de laranja avermelhado e aumente a tonalidade com o tempo. Dessa forma, as partículas vão escurecer à medida que se afastam do centro.

jhocking
fonte
Sim, a textura é apenas um pincel de cor branca com alfa variando do centro.
Aram Kocharyan
huh, se isso é verdade, é estranho para mim que sua captura de tela com transparência alfa tenha aqueles halos escuros ao redor das partículas.
Jhocking
Sim, não sei por que eles se formaram em torno da mistura alfa. Mas, pelo que tenho agora, parece estar bem.
Aram Kocharyan
Veja youtube.com/watch?v=JptGbEO3b5E
Aram Kocharyan
Parece bom, você deve colocar isso na atualização da pergunta.
jhocking