diff --git a/Content/Shaders/MotionBlur.flax b/Content/Shaders/MotionBlur.flax index b713e814b..8a8bb4e4a 100644 --- a/Content/Shaders/MotionBlur.flax +++ b/Content/Shaders/MotionBlur.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af63c3e954919a968e21f19313af1a704c2afa42c5a02744200e1dbf132dc88f -size 9418 +oid sha256:0e8fb3a9a966969ab731455c1d50b280cba0703163cffca93a51fd504262e77e +size 9497 diff --git a/Source/Engine/Renderer/MotionBlurPass.cpp b/Source/Engine/Renderer/MotionBlurPass.cpp index 3077e4cdb..f00df522c 100644 --- a/Source/Engine/Renderer/MotionBlurPass.cpp +++ b/Source/Engine/Renderer/MotionBlurPass.cpp @@ -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); diff --git a/Source/Shaders/MotionBlur.shader b/Source/Shaders/MotionBlur.shader index 153b14bba..7041ec743 100644 --- a/Source/Shaders/MotionBlur.shader +++ b/Source/Shaders/MotionBlur.shader @@ -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;