24 octobre 2024

Implémenter une passe de motion vectors pour le post-traitement

Nouvelle version d'Evergine Les motion vectors sont un élément essentiel des techniques de post-traitement comme le Temporal Anti-Aliasing (TAA) et le Motion Blur. Dans Evergine, une passe de motion vectors permet au GPU de suivre le mouvement des objets et des pixels d'une image à l'autre, pour des effets visuels plus fluides.

Que sont les motion vectors ?

Les motion vectors stockent la façon dont chaque pixel se déplace d'une image à la suivante. C'est essentiel pour les techniques de post-traitement d'Evergine comme le TAA, où l'algorithme accumule des échantillons sur plusieurs images pour réduire les artefacts d'aliasing, en utilisant la texture de motion vectors pour retrouver la position précédente du pixel.

De même, les effets de Motion Blur simulent la traînée des objets en mouvement en fonction de leur vitesse à l'écran. Ces deux effets reposent fortement sur des motion vectors précis pour calculer les ajustements visuels appropriés.

Un Render Path mis à jour pour intégrer les motion vectors

Dans son Render Path par défaut, Evergine utilise un système de Forward Rendering . Il a cependant besoin de passes supplémentaires pour stocker des informations utiles au post-traitement. Jusqu'à présent, nous utilisions une passe de rendu initiale (ZPrePass) pour générer une texture contenant les informations de profondeur, de metalness et de roughness. La nécessité de générer une texture de motion vectors nous a amenés à réorganiser le Render Path par souci de clarté et d'efficacité. Le schéma suivant présente les modifications :

ZPrePass

Désormais, l'étape ZPrePass ne comporte plus qu'une seule texture :

NomFormatDescription
DepthD24S8Informations de profondeur et de stencil. Utiles dans de nombreux effets de post-traitement.

Figure 1 Texture DepthStencil

GBuferPass

Nous avons supprimé l'ancienne étape Distortion et créé une nouvelle passe MRT (Multiple Render Target) utilisant davantage de frame buffers, qui regroupe les informations précédentes avec la nouvelle texture de Motion Vector .

TextureFormatDescription
RT 0R8G8B8A8_UnormStocke plusieurs informations :

– R, G : normales, utilisées pour le SSAO et le SSR.

– B : roughness, utilisée pour le SSR

– A : metalness, utilisée pour le SSR.

RT 1R16G16_FloatLa nouvelle texture de Motion Vector. Elle stocke la vitesse X et Y du pixel dans l'espace écran. Utilisée pour les post-traitements Temporal Antialiasing et Motion Blur.
RT 2R8G8B8A8_UnormContient les informations de distorsion pour l'effet de post-traitement Distortion.

 

Figure 2 Texture de motion vectors ramenée dans une texture RGB normale

Figure 3 Texture de normales, roughness et metalness

DefaultPass

Inchangée par rapport à la version précédente, il s'agit de la passe principale, dans laquelle tous les objets sont rendus dans la scène avec un éclairage Forward et le PBR, en utilisant les passes précédentes si nécessaire. Ses textures sont les suivantes :

NomFormatDescription
ColorR16G16B16A16_Float Texture HDR avec la couleur en espace linéaire.
DepthD24S8Texture avec la profondeur et le stencil finaux.

Figure 4 Texture de couleur (avant post-traitement), en couleur linéaire

 

Une fois le post-traitement appliqué et la couleur corrigée en espace gamma, nous obtenons le résultat final.

Modifications dans le moteur

L'ajout des motion vectors dans Evergine nous a amenés à apporter les modifications suivantes au moteur :

  • Transform3D stocke la matrice World de l'image précédente (PreWorld ) afin de pouvoir reconstruire la position précédente du pixel.
  • SkinnedMeshRenderer conserve désormais les positions de tous les sommets de l'image précédente.
  • Les effets disposent désormais d'un nouveau metatag pour accéder aux matrices de l'image précédente [PreWorld].
  • Dans le cas d'un skinned mesh, la position des sommets de l'image précédente est stockée dans la sémantique Position1 (tandis que Position_0 contient la position de l'image courante, comme d'habitude).
Antonio avila
Auteur
Antonio Ávila
Plain Concepts Research