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.