Fix motion vector stability on Large World origin changes

#3745
This commit is contained in:
Wojtek Figat
2025-10-20 18:08:54 +02:00
parent d93c32db9c
commit 8467315a1e
3 changed files with 9 additions and 3 deletions

BIN
Content/Shaders/MotionBlur.flax (Stored with Git LFS)

Binary file not shown.

View File

@@ -30,6 +30,9 @@ GPU_CB_STRUCT(Data {
Float2 Input0SizeInv;
Float2 Input2SizeInv;
Float3 PrevWorldOriginOffset;
float Dummy1;
});
MotionBlurPass::MotionBlurPass()
@@ -194,6 +197,7 @@ void MotionBlurPass::RenderMotionVectors(RenderContext& renderContext)
Matrix::Transpose(renderContext.View.ViewProjection(), data.CurrentVP);
Matrix::Transpose(renderContext.View.PrevViewProjection, data.PreviousVP);
data.TemporalAAJitter = renderContext.View.TemporalAAJitter;
data.PrevWorldOriginOffset = renderContext.View.Origin - renderContext.View.PrevOrigin;
auto cb = _shader->GetShader()->GetCB(0);
context->UpdateCB(cb, &data);
context->BindCB(0, cb);

View File

@@ -21,6 +21,8 @@ int MaxBlurSamples;
uint VariableTileLoopCount;
float2 Input0SizeInv;
float2 Input2SizeInv;
float3 PrevWorldOriginOffset;
float Dummy1;
META_CB_END
DECLARE_GBUFFERDATA_ACCESS(GBuffer)
@@ -39,7 +41,7 @@ float4 PS_CameraMotionVectors(Quad_VS2PS input) : SV_Target
GBufferData gBufferData = GetGBufferData();
float4 worldPos = float4(GetWorldPos(gBufferData, input.TexCoord, deviceDepth), 1);
float4 prevClipPos = mul(worldPos, PreviousVP);
float4 prevClipPos = mul(worldPos + float4(PrevWorldOriginOffset, 0), PreviousVP);
float4 curClipPos = mul(worldPos, CurrentVP);
float2 prevHPos = prevClipPos.xy / prevClipPos.w;
float2 curHPos = curClipPos.xy / curClipPos.w;