The Motion class provides functions for calculating motion vectors, reprojection, and performing temporal filtering in HLSL shaders. It is useful for implementing effects like Temporal Anti-Aliasing (TAA), motion blur or general reprojection by blending current and previous frame data.

⚠️ Right now this is limited to camera motion only, moving objects currently do not react to their own motion.

API

float3 Motion::GetFromWorldPosition(float3 worldPosition)

  • Reprojects a world-space position to screen-space ( Depth in Z ) coordinates using the last frame's depth buffer.

float3 Motion::Get(float2 screenPosition)

  • Returns the position in clip space ( Pixel Position + Depth in Z ) of where this pixel was projected on the previous frame.

float4 Motion::TemporalFilter( uint2 vPositionSs, Texture2D tCurrent, Texture2D tPrev, float flBlendWeight = 0.9f )

  • A traditional Temporal Anti-Aliasing filter, takes the position of the current pixel and the texture of the current frame, and previous frame and using the motion vectors to blend them.
  • It works as follows:
    • Calculate Previous Frame UV Coordinates:
      • Uses motion vectors to find where the current pixel was in the previous frame.
      • Converts screen-space position to UV coordinates for texture sampling.
    • Compute Min and Max Sample Values:
      • Iterates over a 3x3 pixel neighborhood around the current pixel.
      • Finds the minimum and maximum color values to clamp the previous frame's sample.
    • Sample Previous Frame Texture:
      • Samples the previous frame's texture at the calculated UV coordinates using bilinear filtering.
    • Clamp Previous Frame Sample:
      • Ensures the previous frame's data does not introduce artifacts when blending using a bounding box of colors.
    • Blend Samples:
      • Blends the current frame's sample with the clamped previous frame's sample based on the blend weight.





Created 8 Dec 2024
Updated 9 Dec 2024