octubre 24, 2024

Implementando una pasada de Motion Vectors para Post-processing

Los Motion Vectors de la nueva versión de Evergine son un componente esencial cuando se trabaja con técnicas de post-processing como el Temporal Anti-Aliasing (TAA) y el Desenfoque de Movimiento. En Evergine, una pasada de Motion Vectors permite a la GPU rastrear el movimiento de objetos y píxeles entre frames, lo que facilita efectos más precisos y suaves.

¿Qué son los Motion Vectors?

Los Motion vectors almacenan información sobre cómo se mueve cada píxel de un frame al siguiente. Esto es crucial en técnicas de post-processing en Evergine, como el TAA, donde el efecto acumula samples a lo largo de varios frames para reducir los artefactos de aliasing, utilizando la textura de Motion Vectors para rastrear la ubicación previa del píxel. De manera similar, los efectos de Motion  Blur simulan el rastro de objetos en movimiento en función de su velocidad a través de la pantalla. Ambos efectos dependen en gran medida de motion vectors precisos para calcular los ajustes visuales adecuados.

Actualización del Render Path para adaptarse a los Motion Vectors

En nuestro Render Path por defecto, Evergine usa un sistema de Forward Rendering. Sin embargo, también necesita algunas pasadas de render adicionales para almacenar información útil para el post-processing. Hasta ahora, estábamos usando una pasada inicial (ZPrePass) para generar una textura con información de depth, metalness y roughness. La necesidad de generar una textura de motion vectors nos hizo reorganizar la Render Path para una mayor claridad y eficiencia. El siguiente diagrama explica los cambios:

ZPrePass

Ahora la pasada de ZPrePass sólo renderiza una textura:

NombreFormatoDescripción
DepthD24S8Información de Depth y Stencil. Útil en muchos efectos de post-processing.

Figure 1 Textura de DepthStencil

GBuferPass

Hemos eliminado la pasada anterior de Distortion y creado una nueva pasada MRT (Multiple Render Target) utilizando más texturas, incorporando la información anterior con la nueva textura de Motion Vectors.

TexturaFormatoDescripción
RT 0R8G8B8A8_UnormAlacena mútliple información por canal:

–            R, G: Normales, usadas en SSAO y SSR.

–            B: Roughness, para SSR

–            A: Metalness, para SSR.

RT 1R16G16_FloatLa nueva textura de Motion Vectors. Almacena la velocity de cada píxel en los ejes X e Y del píxel en scren space. Usado en el post-processing de Temporal Anti-Aliasing y Motion Blur.
RT 2R8G8B8A8_UnormContiene información de distorsión para el efecto de post-processing de Distortion.

 

Figure 2 Textura de Motion Vectors texture adaptada a una textura RGB normal

Figure 3 Textura de Normales, roughness y metalness.

DefaultPass

Sin cambios respecto a la versión anterior, esta es la pasada donde todos los elementos se renderizan en la escena con iluminación Forward y PBR, utilizando las pasadas anteriores cuando es necesario. Sus texturas son:

NombreFormatoDescripción
ColorR16G16B16A16_Float Textura HDR texture con el color en linear space.
DepthD24S8Textura con el depth y el stencil finales.

Figure 4 Textura de Color (antes del post-processing), en linear color

 

Una vez aplicado el post-processing y el color es pasado a gamma space, obtenemos el resultado final.

Cambios en el motor

Agregar la función de motion vectors en Evergine nos obligó a realizar los siguientes cambios en el motor:

  • Transform3D ahora almacena la matriz World del frame anterior (PreWorld) para permitir reconstruir la posición previa del píxel.
  • SkinnedMeshRenderer ahora mantiene las posiciones de todos los vértices del frame anterior.
  • Los Effects ahora tienen una nueva Metatag para acceder a las matrices del frame anterior [PreWorld].
  • En el caso de meshes con skinning, la posición del vértice del frame anterior se almacenará como elemento del vértice Position_1 (mientras que en Position_0 estará la posición del frame actual, como es habitual).
Antonio avila
Author
Antonio Ávila
Plain Concepts Research

¿Ya te vas?

Suscríbete a nuestra newsletter para estar al día de las últimas noticias, casos de éxito y mucho más. 

No mandamos spam y puedes darte de baja en cualquier momento.