Página 1 de 1

Problema com surface

Enviado: Dom Nov 20, 2016 5:28 pm
por GabrielXavier
Boa tarde, estou precisando salvar uma imagem através de uma surface porém estou tendo problemas.

O problema é o seguinte, eu preciso desenhar uma imagem normalmente e por cima desta imagem eu desenha uma imagem toda preta com certa transparência, desenhando uma sprite sobre a outra no evento draw o resultado é perfeitamente como o esperado, porém quando eu desenho da mesma forma as duas imagens na surface o resultado é diferente do esperado.

Segue um print, a imgem da esquerda foi gerada através de uma surface, a imagem da direita foi desenhada na tela uma sobre a outra usando o evento draw:
Imagem

Aqui os únicos códigos presentes no projeto:

@CREATE:

Código: Selecionar todos

surf = surface_create(500,400);
surface_set_target(surf);
draw_clear_alpha(c_black, 0);

draw_sprite(sprite0,0,0,0); // Sprite de fundo com a imagem
draw_set_alpha(.65);
draw_sprite(sprite1,0,0,0); //Sprite preta
draw_set_alpha(1);

surface_reset_target();
surface_save(surf,"surf1.png");

spr = sprite_create_from_surface(surf,0,0,500,400,0,0,0,0);

sprite_save(spr,0,"sprite1.png");

@DRAW:

Código: Selecionar todos

draw_sprite(spr,0,0,0); //Spr gerada através da surface

draw_sprite(sprite0,0,520,0);
draw_set_alpha(.65);
draw_sprite(sprite1,0,520,0);
draw_set_alpha(1);
Eu preciso gerar a imagem através da surface e preciso que o resultado seja exatamente como o resultado da direita pois irei escrever sobre a imagem final utilizando texto na cor branca, eu não entendi o por que do problema, tentei desenhar um retângulo preto para escurecer a imagem de fundo e o resultado foi o mesmo que o resultado usando a sprite toda preta, alguém sabe qual o problema?

EDIT: A imagem gerada pela surface esta quase transparente salvei como png e coloquei no photoshop deu pra perceber
PRINT:
Imagem
Mesmo assim não identifiquei solução para o problema.

Re: Problema com surface

Enviado: Dom Nov 20, 2016 5:55 pm
por Denis Lemos

Re: Problema com surface

Enviado: Seg Nov 21, 2016 2:09 pm
por GabrielXavier
A surface até consegue desenhar a imagem um pouco mais escura e sem transparência, porém não é o suficiente pras letras brancas ficarem legíveis sobre a imagem por que os pontos claros da imagem continuam claros, a surface escurece apenas os pontos mais escuros.
Eu preciso criar um traçado preto em volta do texto e a surface também bugou este traçado ele ficou meio branco/cinza.
Eu creio que isso seja um bug nas surfaces, mas o tópico ainda está em aberto.
Obrigado pela dica Denis

Re: Problema com surface

Enviado: Seg Nov 21, 2016 2:32 pm
por Superbomber
O problema deve ser por você está fazendo isso no create, ou por editar o blend mode em algum lugar e não ter voltado ao normal.

Antes de desenhar na surface use draw_set_blend_mode(bm_normal);

O resultado da imagem transparente deixa claro que ao invés de misturar os dois draws o segundo "substituiu" o primeiro.

Caso não resolva, tente gerar as imagens no evento de draw controlando com um booleano para não ficar gerando em repetição.

Bye. :flw:

EDIT: Caso queira escurecer a imagem, pode fazer desta maneira:

Código: Selecionar todos

draw_set_blend_mode(bm_subtract);
draw_set_color(c_white);
draw_set_alpha(0.6);
draw_rectangle(0, 0, surfWidth, surfHeight);
O modo bm_subtract reduz a luminosidade, faça desse modo ao invés de desenhar a img preta.
Creio que terá o resultado desejado. (E não esquecer de "restaurar" os valores do alpha e blend mode depois)

Re: Problema com surface

Enviado: Qua Nov 23, 2016 11:45 pm
por GabrielXavier
@Superbomber


Fiz todos os testes que você mencionou acima e a surface ainda continua sendo criada com a transparência 
DRAW:

Código: Selecionar todos

if !surface_exists(surf){

    surf = surface_create(imgW, imgH);
    surface_set_target(surf);
    
    draw_clear_alpha(c_black, 0);
    draw_set_blend_mode(bm_normal);
    draw_sprite(sprite1,0,0+imgW/2,0+imgH/2);
    
    draw_set_alpha(0.6);
    draw_rectangle(0,0,imgW,imgH,0);
    draw_set_alpha(1);

    surface_reset_target();
}
O problema só acontece quando se desenha algo com transparência na surface, isso faz com que a surface fique com transparência.
Já testei no Windows, testei o mesmo código no Smartphone Android e no navegador com HTML5 e o problema está presente em todas as plataformas.

Ainda não consegui resolver o problema.

Mesmo assim muito obrigado pela ajuda!
 

Re: Problema com surface  Tópico resolvido

Enviado: Seg Dez 19, 2016 12:08 pm
por saim
Desenhar superfícies transparentes sobre uma surface causa transparência, mesmo.
Isso acontece por causa dos blends, que acontecem independente de você ter definido um blend mode ou não. Eles multiplicam/somam/subtraem o valor de cor e alpha das imagens de origem e destino. Acho que no bm_normal, eles se multiplicam, de forma que só vai dar alpha = 1 se as duas alphas forem 1.
Isso não acontece no draw porque o desenho final é aplicado sobre uma superfície preta. O fundo da tela, por assim dizer.

A solução, provavelmente, é criar uma superfície preta e opaca, mudar o blend mode pra bm_add e desenhar essa sua superfície transparente sobre ela, deixando tudo com alpha = 1.

Tem uma outra solução que é usar o valor de alpha de uma sprite, mas não lembro qual é a função usada nem como fazer. Provavelmente, você pega a sprite original e desenha usando algo que eu acho que é draw_sprite_alpha_from_sprite