Pergunta

Estou pensando em jogá motion blur em meu programa 2D, mas duvido que os resultados do meu algoritmo atual.

A minha abordagem parece com isso no momento:

  • Desenhar para backbuffer.
  • Quando o tempo para actualizar tampão dianteira, o misturar backbuffer para o tampão de frente.
  • Repita

O que poderia causar o efeito "motion blur" é, obviamente, a mistura, como objetos em movimento vai deixar uma fuga de desvanecimento.

Este é claramente não muito exigente sobre o hardware, o buffer duplo será feito de qualquer maneira e o passo único extra é a mistura alfa, que é um cálculo simples. No entanto, as trilhas serão muito afiada, e não embaçado em tudo o que podem parecer um pouco estranho. Eu poderia fazer um borrão caixa no buffer de fundo antes da etapa de mistura, mas parece que ele poderia ser muito tributação sobre sistemas low-end como o Nintendo DS.

Existem soluções que permitem que me fazê-lo de forma mais eficiente ou produzir um resultado mais bonito?

Foi útil?

Solução

Realmente você deve processar muitos quadros intermediários e misturá-los em um resultado. Digamos, por exemplo, que a sua taxa de quadros de saída é de 50 fps. Você provavelmente obter um resultado razoável se você prestados internamente a 500 fps e grupos mistos de quadros dez juntos antes de mostrar que para o usuário.

A abordagem que você está usando no momento simula persistência, como se estivesse tornando em um antigo CRT com fósforo lento. Isto não é realmente a mesma coisa que borrão de movimento. Se o seu quadro de duração é de 20ms (1000/50), em seguida, um quadro de movimento borrado consiste em representações que medem a duração quadro 20ms, todos com o mesmo peso alfa. A solução consiste persistência dos revestimentos a partir de 20, 40, 60, 80, de 100ms atrás, gradualmente desaparecendo.

Outras dicas

Não há nenhuma maneira real para fazê-lo de forma mais eficiente ao meu conhecimento. Isso é cerca de tão eficiente quanto ele ganha. Parece muito bom, se a taxa de quadros é bom eo movimento não é muito acentuado também.

O plano mais bonito seria, para cada pixel, desenhar uma linha semi-transparente a partir da nova posição para a posição de idade. Este não é um cálculo trivial, no entanto.

Pode não ser muito afiada em tudo. Tudo depende da função de mistura utilizado. Por exemplo, 0,1 / 0,9 para a imagem anterior / corrente respectivamente irá fornecer alguma fuga fraco.

Devo acrescentar que este é essencialmente como o movimento indefinição em OpenGL é feito (através de buffer de acumulação)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top