GLSL Shader Effects: Como fazer motion blur?

16

Eu tenho um ambiente 2D completo, com sprites circulando como paisagem, personagens etc.

Para torná-lo mais moderno, quero implementar um efeito de desfoque de movimento, semelhante aos jogos modernos de FPS (ou seja, Crysis), ao mover a câmera rapidamente.

Em um controle lateral, o efeito desejado é fazer com que esse leve desfoque apareça para dar a idéia de movimento rápido quando a câmera estiver em movimento. Se alguém pudesse me dar algumas dicas sobre como fazer isso, estou assumindo que em um pixel shader, ficaria agradecido.

Grimshaw
fonte
Mantenha várias cópias do seu buffer renderizado. Por exemplo, desfoque quatro dos quadros anteriores para criar seu quadro atual. Isso deve criar o efeito desejado.
knight666
@ knight666 não seria melhor (memória certamente, velocidade, não tenho certeza) manter 1 buffer extra (chame de A) e misturar uma fração (digamos 0,75) disso com o buffer de saída (indo para a tela, chame B) e depois copie B para A depois. Isso criaria uma média móvel e o aumento do desfoque de movimento não custaria nada extra.
Elva
1
Eu pretendia fazer disso um comentário, mas não consegui encontrar o botão de comentário. De qualquer forma, o que Dave O. diz é provavelmente a melhor aposta e o que é usado em jogos como o Crysis. Isso funciona um pouco assim. Durante a renderização do objeto, Renderize as velocidades do objeto em um buffer separado. O MRT tornará isso um pouco mais rápido, e há várias maneiras de calcular as velocidades, mas você deseja acabar com um buffer adicional que tenha as velocidades de todo o buffer de renderização. Então, em um shader pós-processo, baseado na velocidade em cada pixel, você amostra para o buffer de cor na direção oposta da veloc
Arelius
O código HLSL / Cg na Listagem 27-1 usa as equações anteriores em um sombreador de pixel de pós-processamento de tela cheia para calcular a posição do espaço mundial dos objetos renderizados em um determinado pixel, usando o buffer de profundidade e o inverso da corrente matriz de visão-projeção. ... HLSL .... No seu código, não é GLSL .....

Respostas:

6

Mantenha uma cópia do último buffer de moldura. Obtenha o vetor de movimento da câmera e inverta-o. Desenhe sua cena como de costume, depois desenhe o último buffer de moldura com um pequeno deslocamento (o delta da câmera que você acabou de calcular) e 0,75 alfa. Repita quantas vezes quiser para dar o efeito de desfoque de movimento.

r2d2rigo
fonte
1
Essa abordagem é muito fácil de implementar, mas muito difícil de ajustar (pode parecer objetos deixando rastros em vez de ficar borrados). Outra abordagem também simples é "manchar" os pixels na direção do movimento da câmera invertida em um shader de pixel de pós-processamento.
Dave O.
6
O principal problema dessa abordagem é que ela depende da taxa de quadros - ela parecerá muito diferente se você estiver executando a 20 fps do que se estiver executando a 100 fps. Contanto que você esteja ciente disso e obtenha o resultado desejado na taxa de quadros que executa, tudo bem, mas você precisa estar ciente disso.
Maximus Minimus
19

Eu recomendaria usar este método: Motion Blur como um efeito de pós-processamento

Muito simples de implementar, é o que eu usei na minha demo glsl Ruin island [link]

Kragniz
fonte
Este método é muito superior a mistura em quadros últimos ...
Steven Lu
No momento, esta resposta fornece apenas um link. Se o link quebrar no futuro, ninguém saberá como realmente resolver o problema. Tente incluir pelo menos as informações essenciais fornecidas pelo link
Sim, vamos fazer uma cópia da Internet, porque essa cópia totalmente não vai quebrar qualquer dia: J
SasQ