fixed some motion blur artifacts

fixed:
- sharp moving pixels at screen edges
- static foreground meshes leaving a trail
- static foreground meshes surrounded by sharp moving background pixels
the last 2 items were very noticeable with view weapons

the trade-off is that blurred silhouettes of foreground objects now look worse
This commit is contained in:
myT 2024-04-15 04:03:22 +02:00
parent ea3b071c58
commit 5c4cf3d720
1 changed files with 29 additions and 17 deletions

View File

@ -55,23 +55,34 @@ References:
void ProcessSample(
inout float4 fgAccum, inout float4 bgAccum, inout float alpha, inout float center,
float Zs, float Zc, float Vsl, float Vcl, float distTC, float3 C0s, float3 C1s, float W0d)
float Z0s, float Z1s, float Zc, float Vsl, float Vcl, float distTC, float3 C0s, float3 C1s, float W0d)
{
const float DepthThreshold = 0.28; // 10mm assuming 56u == 2m
if(Zs - DepthThreshold < Zc && Vsl >= distTC)
if(Z0s - DepthThreshold < Zc)
{
fgAccum += float4(C0s, 1) * W0d;
bgAccum += float4(C1s, 1);
alpha += 1.0;
if(Vsl >= distTC)
{
fgAccum += float4(C0s, 1) * W0d;
if(Z1s >= Zc)
{
bgAccum += float4(C1s, 1);
}
alpha += 1.0;
}
}
else if(Zs >= Zc && Vcl >= distTC)
else if(Z0s + DepthThreshold >= Zc)
{
bgAccum += float4(C0s, 1);
if(Vcl >= distTC)
{
bgAccum += float4(C0s, 1);
}
}
else
{
center += 1.0;
float bgness = saturate(0.5 * (Zc + DepthThreshold - Z0s) / DepthThreshold);
bgAccum += float4(C0s, 1) * bgness;
center += 1.0 - bgness;
}
}
@ -170,12 +181,6 @@ float4 ps(VOut input) : SV_Target
float2 TC0 = input.texCoords + i0 * tcStep;
float2 TC1 = input.texCoords + i1 * tcStep;
[branch]
if(!Is01(TC0) || !Is01(TC1))
{
continue;
}
uint2 packedSample0 = packedTexture.Load(uint3(TC0 * fullResSize, 0));
float2 V0s = UnpackHalf2(packedSample0.x);
float V0sl = length(V0s);
@ -194,10 +199,17 @@ float4 ps(VOut input) : SV_Target
float distTC1 = distance(TC1, input.texCoords);
float W1d = max(dot(V1sn, dirn), 0.0);
ProcessSample(fgAccum, bgAccum, alpha, center, Z0s, Zc, V0sl, Vcl, distTC0, C0s, C1s, W0d);
ProcessSample(fgAccum, bgAccum, alpha, center, Z1s, Zc, V1sl, Vcl, distTC1, C1s, C0s, W1d);
if(Is01(TC0))
{
ProcessSample(fgAccum, bgAccum, alpha, center, Z0s, Z1s, Zc, V0sl, Vcl, distTC0, C0s, C1s, W0d);
realSampleCount++;
}
realSampleCount += 2;
if(Is01(TC1))
{
ProcessSample(fgAccum, bgAccum, alpha, center, Z1s, Z0s, Zc, V1sl, Vcl, distTC1, C1s, C0s, W1d);
realSampleCount++;
}
}
if(fgAccum.w <= 0.0 || bgAccum.w <= 0.0)