Pedido de engines: desfoque e clareamento

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

Pedido de engines: desfoque e clareamento

Mensagem por saim em Ter 19 Fev 2013, 10:49

Estou começando um jogo que terá algumas cenas de sonho. Então eu gostaria de alguns efeitos especiais nessas cenas.


Primeira parte:

Sendo bem pé-no-chão, eu jamais conseguirei colocar animações nessas cenas. Então eu gostaria que as imagens fizessem o seguinte:

- o foco oscilasse e a liuminação variasse.

O foco é o seguinte: a imagem perde e ganha foco em função de uma variável, que varia suavemente entre um valor de "foco total" e um valor de "foco mínimo".
A iluminação seria como se a imagem fosse uma transparência sobre uma lâmpada mal energizada, que varie como o foco varia: suavemente entre um valor "iluminação máxima" e "iluminação mínima".
Nos dois casos, eu gostaria que a oscilação fosse como uma senóide irregular. Não quero que os valores de "iluminação" e "foco" estejam relacionados.


Segunda parte:

Na última cena, quero que a imagem fique totalmente branca, mas aos poucos. Como se uma luz invadisse a cena do centro e soprasse as partes escuras pra fora, como areia. O foco, nesse caso, deve ser totalmente perdido, até virar um borrão branco.

falhei em:

Nem tentei a variação, ainda. Travei no desfoque.

(A) Resize blur
Tentei refazer uma engine que tinha visto na GMC, a algum tempo atrás, que basicamente coloca a imagem numas surfaces, encolhendo e alongando a imagem. Fiz isso encolhendo primeiro e esticando depois, o resultado é um pixelamento da imagem. Se eu alongar primeiro e encolher depois, o resultado é a imagem original. Eis o draw_event que encolhe primeiro:

Código:
surface_set_target(blur);
draw_sprite(sprite_index, 0, 0, 0);
surface_reset_target();

if (varia > 0){ // 'varia' é uma senoidal
   surface_set_target(base1); //na surface pequena
   draw_sprite_ext(sprite_index, 0, 0, 0, 1 / fator, 1 / fator, 0, $ffffff, 1); // desenha a sprite, encolhida
   
   repeat(ceil(varia)){
      surface_set_target(base2); // na surface normal
      draw_surface_ext(base1, 0, 0, fator, fator, 0, $ffffff, 1); // desenha a pequena, esticada
      surface_set_target(base1); //na surface pequena
      draw_surface_ext(base2, 0, 0, 1 / fator, 1 / fator, 0, $ffffff, 1); //desenha a normal, encolhida
      }
   
   surface_set_target(blur); // na que vai pra tela
   draw_surface_ext(base1, 0, 0, fator, fator, 0, $ffffff, 1); // desenha a pequena, esticada
   
   surface_reset_target();
   }

draw_surface(blur, 0, 0);

draw_text_color(20, 20, string(varia), $0000ff,$0000ff,$0000ff,$0000ff, 1); // a imagem é em preto-e-branco
Detalhezinho chato: não importa o valor de "varia". Se é 1 ou 1000, o resultado é o mesmo.

(B) alpha blur
Na verdade, o resultado é até legalzinho, mas pro segundo efeito, porque as partes brancas ficam muito brancas. Eu repito a imagem com alpha baixo, mas usando bm_add.
O chato é que a imagem fica mais tremendo do que desfocada. E se eu tirar o random, repetindo a imagem ao redor da original, não dá um resultado bacana, fica "certinho" demais.
Código:
draw_sprite_ext(sprite_index, image_index, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha); // desenha com foco normal, por baixo de tudo

var delta;
delta = 20 * desfoque; // precisa variar muito, pra ficar bom
draw_set_blend_mode(bm_add); // muda o blend mode
repeat(desfMin + ceil(desfoque * dDesf)){ // de desfMin a desfMax
   draw_sprite_ext(sprite_index, image_index, x - delta / 2 + random(delta), y - delta / 2 + random(delta), 1, 1, 0, $ffffff, 1 / 30);
   }
draw_set_blend_mode(bm_normal); //reseta o blend mode

draw_text_color(20, 20, string(desfoque), $0000ff,$0000ff,$0000ff,$0000ff, 1); // a imagem é em preto-e-branco

Você tem uma engine que eu possa usar?
Gozado, tinha certeza de já ter visto dezenas de engines de blur. Agora que eu preciso delas, elas somem...

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: Pedido de engines: desfoque e clareamento

Mensagem por Kabeção em Ter 19 Fev 2013, 11:45

Código:
ang += 0.05;
variacao = (sin(ang)+1)/2;
Com ang indo de 0 a 360, variacao vai de 0 a 1 de forma mais lenta no começo e no final.
Na verdade o que se faz aqui é apenas achar o y percorrendo um circulo. Você pode usar a formula normal para senoide mas não acho necessário para um efeito fade in/out.

Gostei do efeito do segundo exemplo.
Já se perguntou para que alguem iria querer que valores randomicos se repetissem?
O problema da tremulação é um dos casos em que você precisa disso.
Redefina a seed sempre antes de começar o loop.
Código:
random_set_seed(1000);

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: Pedido de engines: desfoque e clareamento

Mensagem por saim em Ter 19 Fev 2013, 14:29

Kabeção escreveu:Na verdade o que se faz aqui é apenas achar o y percorrendo um circulo. Você pode usar a formula normal para senoide mas não acho necessário para um efeito fade in/out.
É o que eu estou fazendo, pra definir os valores de "varia". Ainda estou pensando se eu coloco o giro de forma aleatória (ang += 0.05 + valor aleatório) ou se mantenho uma variação regular. Primeiro eu preciso conseguir o blur pra depois testar.

Kabeção escreveu:Já se perguntou para que alguem iria querer que valores randomicos se repetissem?
Não entendi a relação da pergunta com o problema... No código, eles não se repetem.
Talvez seja por causa do comentário que eu fiz de tirar o random. Talvez seja porque eu não faça idéia do que seja uma seed.
Kabeção escreveu:O problema da tremulação é um dos casos em que você precisa disso.
Redefina a seed sempre antes de começar o loop.
Código:
random_set_seed(1000);
Pois é. O que é essa seed?
Manual escreveu:random_set_seed(seed) Sets the seed (an integer) that is used for the random number generation. Can be used to repeat the same random sequence. (Note though that also some actions and the system itself uses random numbers.)
Tenho a impressão que "random" seja uma função que na verdade gere resultados diferentes em função de um número de entrada. É, isso explicaria seu comentário... testando em 3... 2... 1...
(mas se você puder confirmar se essa interpretação está correta, eu ainda agradeço!)

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: Pedido de engines: desfoque e clareamento

Mensagem por Kabeção em Ter 19 Fev 2013, 15:00

Aleatoriedade de verdade não existem em informática!
Levando em conta a lógica tente imaginar como é possível achar um número aleatório sem uma base?
Não da para aparecer do nada, é como "v += 1;" sem nunca ter definido "v".

seed é a base, o algoritmo trabalha encima dela, volta um valor e muda a seed assim a próxima função chamada tera outra base.

Por tanto se você fazer isso:
Código:
random_set_seed(1000);
repeat(desfMin + ceil(desfoque * dDesf)){ // de desfMin a desfMax
      draw_sprite_ext(sprite_index, image_index, x - delta / 2 + random(delta), y - delta / 2 + random(delta), 1, 1, 0, $ffffff, 1 / 30);
}
random(delta) retornara os mesmos valores evitando aquela tremulação.

Atualmente você só encontrara randomização de alta qualidade no computador no http://www.random.org/ porque ele usa ruido atmosferico como base e por ser algo causado pela natureza é impossível preve-lo (pelo menos até hoje).


No segundo efeito se você tirar o blend_mode da um efeito bem parecido com blur/desfoque.
Ele é rápido e serve para os dois tipos.

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: Pedido de engines: desfoque e clareamento

Mensagem por saim em Ter 19 Fev 2013, 15:51

Excelente!
O teste realmente eliminou a tremulação!

Beleza! Gostei dos resultados! Entendi a tal da seed! E já achei a função randomize, pra usar depois (embora não faça idéia de como ela possa funcionar - mas funciona!).
Podemos considerar esse tópico resolvido!

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: Pedido de engines: desfoque e clareamento

Mensagem por Conteúdo patrocinado Hoje à(s) 04:42


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