Efectos de sombreado GLSL: ¿Cómo hacer movimiento borroso?

16

Tengo un entorno 2D completo, con sprites dando vueltas como paisaje, personajes, etc.

Para que tenga un aspecto más moderno, quiero implementar un efecto de desenfoque de movimiento, similar al desenfoque de los juegos FPS modernos (es decir, Crysis) al mover la cámara rápidamente.

En un desplazamiento lateral, el efecto deseado es que aparezca este ligero desenfoque para dar la idea de un movimiento rápido cuando la cámara se está moviendo. Si alguien pudiera darme algunos consejos para hacerlo, supongo que en un sombreador de píxeles, estaría agradecido.

Grimshaw
fuente
Mantenga múltiples copias de su búfer renderizado. Por ejemplo, desenfoque cuatro de los cuadros anteriores para crear su cuadro actual. Eso debería crear el efecto que deseas.
knight666
@ knight666, ¿no sería mejor? llámelo B) y luego copie B a A después. Esto crearía un promedio móvil y aumentar el desenfoque de movimiento no costaría nada extra.
Elva
1
Quise hacer de esto un comentario, pero no pude encontrar el botón de comentarios. De todos modos, lo que dice Dave O. es probablemente tu mejor apuesta y lo que se usa en juegos como Crysis. Esto funciona un poco como esto. Durante el renderizado de objetos, renderice las velocidades de los objetos en un búfer separado. MRT hará esto un poco más rápido, y hay varias formas de calcular las velocidades, pero desea terminar con un búfer adicional que tenga las velocidades para todo el búfer de renderizado. Luego, en un sombreador posterior al proceso, basado en la velocidad de cada píxel, se muestrea en el búfer de color en la dirección opuesta a la velocidad
Arelius
El código HLSL / Cg en el Listado 27-1 usa las ecuaciones anteriores en un sombreador de píxeles de postprocesamiento de pantalla completa para calcular la posición del espacio mundial de los objetos renderizados en un píxel dado, usando el búfer de profundidad y el inverso de la corriente matriz de vista y proyección. ... HLSL .... En su código no es GLSL .....

Respuestas:

6

Guarde una copia del último framebuffer. Obtenga el vector de movimiento de la cámara e inviértalo. Dibuja tu escena como de costumbre, luego dibuja el último framebuffer con un ligero desplazamiento (el delta de cámara que acabas de calcular) y 0,75 alfa. Repita tantas veces como desee para dar el efecto de desenfoque de movimiento.

r2d2rigo
fuente
1
Este enfoque es muy fácil de implementar pero muy difícil de ajustar (puede parecer que los objetos dejan rastros en lugar de ser borrosos). Otro enfoque también simple es "difuminar" píxeles en la dirección del movimiento de la cámara invertida en un sombreador de píxeles posterior al procesamiento.
Dave O.
66
El principal problema con este enfoque es que depende de la velocidad de fotogramas: se verá muy diferente si está ejecutando a 20 fps de cómo se ve si está ejecutando a 100 fps. Siempre y cuando sea consciente de eso y obtenga el resultado que desea a la velocidad de fotogramas a la que se ejecuta, está bien, pero debe ser consciente de ello.
Maximus Minimus
19

Recomendaría usar este método: Motion Blur como efecto de postprocesamiento

Muy sencillo de implementar, es el que utilicé en mi demo glsl Ruin island [enlace]

kragniz
fuente
Este método es muy superior a la combinación en cuadros pasados ​​...
Steven Lu
Tal como está ahora, esta respuesta solo proporciona un enlace. Si el enlace se rompe en el futuro, nadie sabrá cómo resolver realmente su problema. Intente al menos incluir la información esencial que le brinda el enlace
Sí, hagamos una copia de Internet, porque esa copia no se romperá totalmente ningún día: J
SasQ