Problema geral de alpha

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Problema geral de alpha

Mensagem por Rodrigo Santiago em Ter 07 Maio 2013, 19:13

Olha só:
Tenho uma sprite com alpha em algumas partes semi transparente,e uma outra sprite 100% opaca.

Eu desenho a opaca, DEPOIS, desenho ,por cima, a que possui transparencia. E crio uma sprite da tela. Salvo ela como strip. E nas partes em que havia semi transparencia , em vez de esta parte ser transparente com a outra sprite, ela é transparente com a cor de background!
Olha só:
imagem 1:


imagem 2

Resultado:



A cor do BG é cinza, padrão mesmo.
E veja .
Parece que o alpha está sendo medido 2 vezes, com o fundo e com a outra imagem, o que não devia acontecer. Pois a outra imagem é 100% opaca! E é desenhada primeiro!


SEGUNDO ERRO:
Se eu tiver uma imagem com semi transparencia, desenhar essa sprite numa surface, e criar uma sprite da surface, desenhar esta nova imagem na surface, e recriar a sprite da surface TODO alpha <1 é dividido por 2.

Rodrigo Santiago

Ranking : Nota B
Número de Mensagens : 1281
Idade : 20
Data de inscrição : 28/07/2012
Notas recebidas : C + C + B
Reputação : 73
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 1
   : 3

Voltar ao Topo Ir em baixo

Re: Problema geral de alpha

Mensagem por saim em Ter 21 Maio 2013, 16:38

Isso acontece, mesmo. É por causa do blend mode. Até hoje eu tenho dificuldade pra aceitar isso, também.

Se você der uma olhada no tutorial a respeito de blend modes, vai ver que o bm_normal (default) equivale a
Código:
draw_set_blend_mode_ext(bm_src_alpha, bm_inv_src_alpha);
Então você vai desenhar algo semi-transparente sobre uma superfície 100% opaca. Se fosse só 100% transparente ou só 100% opaca, não haveria necessidade de esquentar a cabeça, mas estamos falando em valores intermediários. Digamos, alpha=0.2.
Vamos nos preocupar apenas com o canal alpha (vou considerar que a cor é irrelevante).

Por "fonte" vamos entender "a sprite semi-transparente (alpha = 0.2) que estamos desenhando agora" e por "destino", vamos entender "a sprite totalmente opaca (alpha = 1.0) sobre a qual estamos desenhando.

Bom, como o tutorial diz, devemos multiplicar o alpha da fonte pelo próprio alpha da fonte (bm_src_alpha) e o alpha do destino pelo inverso do alpha da fonte (bm_inv_src_alpha). Depois somar os resultados.
Deixa eu puxar uma calculadora aqui...
0.2 * 0.2 + 1 * 0.8 =
0.04 + 0.8 = 0.84

Bizarro, né? Já comentei que até hoje tenho dificuldade em aceitar isso?

Eu li num tutorial, do brendan, um truque pra fugir disso (se você realmente só quiser exportar a sprite). Você pega sua sprite com alpha duvidoso e mistura com um fundo totalmente preto e opaco, usando bm_add. O resultado é que você vai manter as cores originais (já que vai estar somando com preto, ou seja, zero) e o alpha será a soma das duas alphas, o que certamente vai ser maior ou igual a 1 (se o resultado for maior, o programa ignora o excesso).
Fazer isso em tempo real pode ser meio chato e, provavelmente, inutil. Mas pra montar uma imagem que vai ser usada com mais frequencia que alguns frames, pode valer a pena.

[edit] fui reler o tutorial e - olha só - esse caso está previsto! Era esperado isso, mesmo.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Problema geral de alpha

Mensagem por Kabeção em Qua 22 Maio 2013, 13:22

Eu também já tive problemas com isso e consegui a explicação na época.

Parece que o alpha está sendo medido 2 vezes, com o fundo e com a outra imagem
Isso acontece porque as cores dos pixels da imagem com transparência não estão multiplicadas pelo seu alpha (non-premultiplied alpha), ou seja, o RGBA é a cor com máxima intensidade seguida do valor do alpha, então um vermelho com 50% de transparência seria: (1,0,0,0.5)

Quando você desenha isso encima de outra imagem a cor com máxima intensidade sera aplicada a proxima causando esses problemas, por isso os pixeis transparentes continuam na cor do background.

Agora em uma imagem com premultiplied alpha o RGB é multiplicado pelo alpha, assim o RGBA do mesmo vermelho com 50% de transparência seria: (0.5,0,0,0.5).
O vermelho não esta mais com máxima intensidade seguido do alpha, agora já é a cor final e a renderização pode processar de maneira correta a sobreposição das imagens.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Problema geral de alpha

Mensagem por Conteúdo patrocinado Hoje à(s) 06:14


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum