Effets de shader GLSL: Comment faire un flou de mouvement?

16

J'ai un environnement 2D complet, avec des sprites qui circulent comme paysage, personnages, etc.

Pour le rendre plus moderne, je veux implémenter un effet de flou de mouvement, similaire aux jeux FPS modernes (c.-à-d. Crysis) flou lorsque vous déplacez rapidement la caméra.

Dans une roulette latérale, l'effet souhaité est d'avoir ce léger flou qui donne l'idée d'un mouvement rapide lorsque la caméra se déplace. Si quelqu'un pouvait me donner quelques conseils pour le faire, je suppose que dans un pixel shader, je serais reconnaissant.

Grimshaw
la source
Conservez plusieurs copies de votre tampon rendu. Par exemple, floutez quatre des images précédentes pour créer votre image actuelle. Cela devrait créer l'effet souhaité.
knight666
@ knight666 ne serait-il pas préférable (mémoire certainement, vitesse je ne suis pas sûr) de garder 1 tampon supplémentaire (appelez-le A) et de mélanger une fraction (disons 0,75) de cela avec le tampon de sortie (aller à l'écran, appelez-le B), puis copiez B vers A par la suite. Cela créerait une moyenne mobile et l'augmentation du flou de mouvement ne coûterait rien de plus.
Elva
1
Je voulais en faire un commentaire, mais je n'ai pas trouvé le bouton de commentaire. Quoi qu'il en soit, ce que Dave O. dit est probablement votre meilleur pari et ce qui est utilisé dans des jeux comme Crysis. Cela fonctionne un peu comme ça. Pendant le rendu d'objet, restituez les vitesses d'objet dans un tampon séparé. MRT rendra cela un peu plus rapide, et il existe plusieurs façons de calculer les vitesses, mais vous voulez vous retrouver avec un tampon supplémentaire qui a les vitesses pour tout le tampon de rendu. Ensuite, dans un shader de post-traitement, basé sur la vitesse à chaque pixel, vous échantillonnez dans le tampon de couleur dans la direction opposée du veloc
Arelius
Le code HLSL / Cg du Listing 27-1 utilise les équations précédentes dans un pixel shader de post-traitement plein écran pour calculer la position dans l'espace mondial des objets rendus à un pixel donné, en utilisant le tampon de profondeur et l'inverse du courant matrice de projection de vue. ... HLSL .... Dans votre code ce n'est pas GLSL .....

Réponses:

6

Conservez une copie du dernier tampon d'image. Obtenez le vecteur de mouvement de la caméra et inversez-le. Dessinez votre scène comme d'habitude, puis dessinez le dernier tampon d'image avec un léger décalage (le delta de la caméra que vous venez de calculer) et 0,75 alpha. Répétez autant de fois que vous le souhaitez pour donner un effet de flou de mouvement.

r2d2rigo
la source
1
Cette approche est très facile à mettre en œuvre mais très difficile à affiner (elle peut ressembler à des objets laissant des traces au lieu d'être floues). Une autre approche également simple consiste à "maculer" les pixels dans la direction de mouvement de la caméra inversée dans un pixel shader de post-traitement.
Dave O.
6
Le principal problème avec cette approche est qu'elle dépend de la fréquence d'images - elle sera très différente si vous exécutez à 20 images par seconde à quoi elle ressemble si vous exécutez à 100 images par seconde. Tant que vous en êtes conscient et que vous obtenez le résultat que vous souhaitez au taux de rafraîchissement que vous utilisez, c'est bien, mais vous devez en être conscient.
Maximus Minimus
19

Je recommanderais d'utiliser cette méthode: Motion Blur comme effet de post-traitement

Très simple à mettre en œuvre, c'est celui que j'ai utilisé dans ma démo glsl Ruin island [link]

kragniz
la source
Cette méthode est de loin supérieure au mélange dans les images précédentes ...
Steven Lu
Dans l'état actuel des choses, cette réponse ne fournit qu'un lien. Si le lien se rompt à l'avenir, personne ne saura comment résoudre réellement son problème. Essayez au moins d'inclure les informations essentielles que le lien vous donne
Ouais, faisons une copie d'Internet, parce que cette copie ne cassera pas du tout: J
SasQ