Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
Problema geral de alpha
3 participantes
Página 1 de 1
Problema geral de alpha
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.
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- Games Ranking :
Notas recebidas : C + C + B
Data de inscrição : 28/07/2012
Reputação : 73
Número de Mensagens : 1281
Prêmios :
x 0 x 0 x 0
x 3 x 1 x 3
x 0 x 0 x 0
Re: Problema geral de alpha
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
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.
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);
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Problema geral de alpha
Eu também já tive problemas com isso e consegui a explicação na época.
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.
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)Parece que o alpha está sendo medido 2 vezes, com o fundo e com a outra imagem
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.
Tópicos semelhantes
» Problema com alpha no GM8. sprite_set_alpha_from_sprite tem bug???
» Dúvidas em Geral
» [dica][geral] facilidades gm 4.3
» [Resolvido]Dúvidas em geral! Dll, mmorpg
» Alpha no GM 5.3a
» Dúvidas em Geral
» [dica][geral] facilidades gm 4.3
» [Resolvido]Dúvidas em geral! Dll, mmorpg
» Alpha no GM 5.3a
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos