
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:
Nombre | Formato | Descripción |
Depth | D24S8 | Informació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.
Textura | Formato | Descripción |
RT 0 | R8G8B8A8_Unorm | Alacena mútliple información por canal: – R, G: Normales, usadas en SSAO y SSR. – B: Roughness, para SSR – A: Metalness, para SSR. |
RT 1 | R16G16_Float | La 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 2 | R8G8B8A8_Unorm | Contiene 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:
Nombre | Formato | Descripción |
Color | R16G16B16A16_Float | Textura HDR texture con el color en linear space. |
Depth | D24S8 | Textura 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).