Add highlight to Motion Vectors Debug view for better content optimizing

This commit is contained in:
2026-05-04 16:43:41 +02:00
parent 6cc0edf0eb
commit 429f8e5336
4 changed files with 43 additions and 7 deletions
Binary file not shown.
+23
View File
@@ -236,20 +236,43 @@ void MotionBlurPass::RenderMotionVectors(RenderContext& renderContext)
void MotionBlurPass::RenderDebug(RenderContext& renderContext, GPUTextureView* frame) void MotionBlurPass::RenderDebug(RenderContext& renderContext, GPUTextureView* frame)
{ {
auto outputView = renderContext.Task->GetOutputView();
auto outputViewport = renderContext.Task->GetOutputViewport();
auto context = GPUDevice::Instance->GetMainContext(); auto context = GPUDevice::Instance->GetMainContext();
const auto motionVectors = renderContext.Buffers->MotionVectors; const auto motionVectors = renderContext.Buffers->MotionVectors;
context->ResetRenderTarget();
if (!motionVectors || !motionVectors->IsAllocated() || checkIfSkipPass()) if (!motionVectors || !motionVectors->IsAllocated() || checkIfSkipPass())
{ {
context->SetRenderTarget(outputView);
context->SetViewportAndScissors(outputViewport);
context->Draw(frame); context->Draw(frame);
return; return;
} }
// Draw depth of objects that draw motion vectors for better debugging content when optimizing this pass
auto desc = GPUTextureDescription::New2D(motionVectors->Width(), motionVectors->Height(), PixelFormat::D16_UNorm, GPUTextureFlags::ShaderResource | GPUTextureFlags::DepthStencil);
auto motionObjectsDepth = RenderTargetPool::Get(desc);
{
PROFILE_GPU_CPU("Motion Vectors Depth");
context->SetRenderTarget(motionObjectsDepth->View(), nullptr);
context->SetViewportAndScissors((float)desc.Width, (float)desc.Height);
context->ClearDepth(motionObjectsDepth->View());
renderContext.View.Pass = DrawPass::Depth;
renderContext.List->ExecuteDrawCalls(renderContext, DrawCallsListType::MotionVectors);
context->ResetRenderTarget();
}
PROFILE_GPU_CPU("Motion Vectors Debug"); PROFILE_GPU_CPU("Motion Vectors Debug");
context->BindSR(0, frame); context->BindSR(0, frame);
context->BindSR(1, renderContext.Buffers->MotionVectors->View()); context->BindSR(1, renderContext.Buffers->MotionVectors->View());
context->BindSR(2, motionObjectsDepth->View());
context->SetState(_psMotionVectorsDebug); context->SetState(_psMotionVectorsDebug);
context->SetRenderTarget(outputView);
context->SetViewportAndScissors(outputViewport);
context->DrawFullscreenTriangle(); context->DrawFullscreenTriangle();
context->ResetSR(); context->ResetSR();
RenderTargetPool::Release(motionObjectsDepth);
} }
void MotionBlurPass::Render(RenderContext& renderContext, GPUTexture*& frame, GPUTexture*& tmp) void MotionBlurPass::Render(RenderContext& renderContext, GPUTexture*& frame, GPUTexture*& tmp)
-3
View File
@@ -789,9 +789,6 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
// Debug motion vectors // Debug motion vectors
if (renderContext.View.Mode == ViewMode::MotionVectors) if (renderContext.View.Mode == ViewMode::MotionVectors)
{ {
context->ResetRenderTarget();
context->SetRenderTarget(task->GetOutputView());
context->SetViewportAndScissors(outputViewport);
MotionBlurPass::Instance()->RenderDebug(renderContext, frameBuffer->View()); MotionBlurPass::Instance()->RenderDebug(renderContext, frameBuffer->View());
RenderTargetPool::Release(tempBuffer); RenderTargetPool::Release(tempBuffer);
RenderTargetPool::Release(frameBuffer); RenderTargetPool::Release(frameBuffer);
+18 -2
View File
@@ -71,10 +71,26 @@ float4 MotionVectorToColor(float2 v)
META_PS(true, FEATURE_LEVEL_ES2) META_PS(true, FEATURE_LEVEL_ES2)
float4 PS_MotionVectorsDebug(Quad_VS2PS input) : SV_Target float4 PS_MotionVectorsDebug(Quad_VS2PS input) : SV_Target
{ {
float4 c = SAMPLE_RT(Input0, input.TexCoord); float4 color = SAMPLE_RT(Input0, input.TexCoord);
// Grey-out background pixels (that don't draw dedicated motion vectors)
float motionObjectsDepth = SAMPLE_RT_DEPTH(Input2, input.TexCoord);
#if REVERSE_Z
bool isBackground = motionObjectsDepth <= 0;
#else
bool isBackground = motionObjectsDepth >= 1;
#endif
uint2 checkerboardCoord = (uint2(input.Position.xy) >> 3) & 0x1;
float checkerboard = checkerboardCoord.x == checkerboardCoord.y ? 1.0f : 0.0f;
float3 backgroundColor = Luminance(color.rgb).xxx * (0.4f + 0.1f * checkerboard);
color.rgb = select(isBackground, backgroundColor, max(color.rgb, 0.2f));
// Debug color based on the pixel motion
float2 v = SAMPLE_RT(Input1, input.TexCoord).xy * 20.0f; float2 v = SAMPLE_RT(Input1, input.TexCoord).xy * 20.0f;
float4 vC = MotionVectorToColor(v); float4 vC = MotionVectorToColor(v);
return float4(lerp(c.rgb, vC.rgb, vC.a * 0.6f), c.a); color.rgb = lerp(color.rgb, vC.rgb, vC.a * 0.6f);
return color;
} }
// Returns the longer velocity vector // Returns the longer velocity vector