RenderDoc for Unreal
RenderDoc is the cross-API single-frame inspector that does what neither Insights nor PIX can: walk every draw call in a frame, see every PSO and bound resource, debug HLSL line-by-line, and run pixel history to trace every modification of one pixel. This tutorial covers plugin install, capture workflow, the UE 5.6 PDB split that broke shader source view, and when to reach for RenderDoc vs PIX vs Insights.
When to use RenderDoc
RenderDoc's strengths over its alternatives:
- Cross-API. D3D11/12, Vulkan, OpenGL/GLES — the same UI everywhere. PIX is D3D12-Windows only.
- Mesh viewer. Pre/post-vertex-shader geometry, with overlays, frustum, world-space inspection. RenderDoc's signature feature.
- Pixel history. Click any pixel; see every draw that touched it across the frame, in order, with the depth/stencil/blend state at each.
- HLSL line-by-line debugging. Step through a shader at a specific pixel with watch variables.
- Free and open source. No license server, no platform gating.
Per Tom Looman's framing, RenderDoc is "fantastic to dissect how Unreal is rendering your frame." Reach for it when you need to understand what the GPU is doing — not just timing it.
Plugin install & configuration
- Plugins panel → search "RenderDoc" → enable RenderDoc Plugin → restart editor.
- Two new toolbar buttons appear top-right of the Level Editor: capture, options.
- Project Settings → Plugins → RenderDoc → set executable path. Toggle "Capture all activity," "Capture callstack," "Capture all resources" as needed.
- For PIE / standalone where the toolbar is hidden, use the console:
RenderDoc.CaptureFrame.
For shader debugging, set this CVar block in DefaultEngine.ini or ConsoleVariables.ini:
[/Script/Engine.RendererSettings] r.Shaders.Optimize=0 ; Required for HLSL stepping; may crash UE 5.5+, verify r.Shaders.Symbols=1 ; Emit shader debug symbols r.Shaders.ExtraData=1 ; Extra reflection metadata r.Shaders.SkipCompression=1 ; Keep symbols uncompressed for RD r.Shaders.WriteSymbols=1 ; Write PDB/symbol files (5.6 split them out) r.ShowMaterialDrawEvents=1 ; Per-material GPU events
Capture workflow end-to-end
Three entry paths:
- Editor capture button — from the Level Editor toolbar; F12 hotkey. Easiest path.
- File → Launch Application from RenderDoc UI — launches a packaged build under RenderDoc, captures via F12 or PrintScreen in-game.
- Attach to Running Instance — for already-running processes. Note: editor PIE captures are the most fragile path; NoEditor Development build is the most reliable target.
Multi-capture thumbnail strip across the bottom shows every capture in the session. Open a second RenderDoc instance for side-by-side compare; the tool doesn't have a built-in diff view (issue #1401), so manual side-by-side is the workflow.
Walking a UE5 frame pass-by-pass
The Event Browser hierarchy in a typical UE5 frame, top-to-bottom:
- Lumen Scene Update — surface cache page maintenance, mesh card placement.
- Nanite VisBuffer build — cluster culling + raster.
- Base Pass — G-buffer fill (deferred) or shaded forward.
- Distance Field shadows (if enabled).
- Lumen Reflections / SSGI — reflection trace pipeline.
- Translucency — alpha-blended geometry and particles.
- TSR / DLSS / FSR — upscaler.
- Post Process — tonemap, bloom, DOF, motion blur.
Right-click any event → "Add Bookmark" to mark it. Use F2 to navigate between events. Most UE5 perf investigations follow the same pattern: skim the timing breakdown, find the heaviest pass, drill into its draws.
Texture viewer and pixel history
Texture viewer (T key) shows any selected resource at any point in the frame. Mip/array slice navigation, custom HLSL/GLSL visualization shaders for packed G-Buffer data (e.g., decode UE5's GBuffer.A into shading model + AO), HDR range-remap controls.
Pixel history (right-click any pixel → History) traces every modification of one pixel across the frame. The list shows each draw that wrote, its depth/stencil/blend state, and whether the pixel was visible. This is invaluable for "why is this pixel red?" investigations — for example, determining whether an unexpected color came from a translucent particle, a UI overlay, or a base-pass material with a wrong vertex color.
HLSL shader debugging in UE5
RenderDoc 1.38+ supports HLSL stepping on D3D11/D3D12 + Vulkan with the NonSemantic.Shader.DebugInfo.100 extension. Enable the CVar block in step 2, package, capture, then in the Pipeline State view click "Edit Shader" or pick a pixel and step through.
<project>/Saved/ShaderSymbols. RenderDoc < 1.38 cannot resolve them, and Tools → "Resolve Symbols" doesn't pick them up after path changes — reload the capture instead. Configure RenderDoc Settings → Core → Shader debug search paths to <project>/Saved/ShaderSymbols. Source-build workaround: add -Qembed_debug in D3DShaderCompilerDXC.cpp. Tracked as Epic forum thread.
r.Shaders.Optimize=0 may crash UE 5.5+ on some configurations — community-reported but not universal. If HLSL stepping crashes, use the assembly view instead of HLSL view as a fallback.
Comparing two captures (regression triage)
RenderDoc has no built-in capture diff. The senior workflow:
- Capture baseline (pre-regression build), save as
baseline.rdc. - Capture candidate (after-regression build) under identical scene state.
- Open both in two RenderDoc instances side-by-side.
- Walk Event Browser in lockstep; compare draw counts, pass durations, PSO bind frequency, mesh viewer geometry.
For regression triage: most differences fall into "more draws," "different PSOs," or "different bound resources." All three are immediately visible in pass-by-pass comparison. The tedium is real; that's why CI-driven regression detection (which is what PerfGuard automates) catches them earlier in the loop.
UE5-specific gotchas
- RenderDoc captures only command lists active during the F12 frame. Deferred lists recorded once and replayed (UE5's parallel RHI submission can use these) may not be re-captured.
- Vulkan + SM6 + 5.6.1 startup failure — RenderDoc reports
multiviewMeshShader=VK_FALSEand lacksR64_UINTstorage flags; UE rejects the device. Workaround:-SkipVulkanProfileCheckorr.Vulkan.UseProfileCheck=0. Tracked as UE-356685. r.ShowMaterialDrawEvents=1matches what-AttachRenderdocexposes inside Insights. Without it, per-material events are hidden.- Disable IoStore + EOS overlay in packaged captures — they can interfere with RenderDoc's hooks.
- Editor toolbar buttons hidden in PIE / standalone — use
RenderDoc.CaptureFrameconsole command. - "Capture all activity" off by default — only the active viewport is captured; toggle on for material editor thumbnails or asset previews.
- Nanite occlusion is invisible to RenderDoc DepthTest overlay — Nanite does not issue per-instance GPU queries (per Tom Looman).
- Android capture conflicts with Android Studio — close Android Studio before attaching to a Quest or Android device, or disable ADB integration.
Decision matrix: RenderDoc / PIX / Insights
| Symptom | Use | Why |
|---|---|---|
| "Why is this pixel wrong?" | RenderDoc (pixel history) | No other tool traces per-pixel draws |
| "Why is this draw slow?" | PIX (GPU timing) or RenderDoc | PIX has hardware counters on Windows D3D12 |
| "Why is the frame slow overall?" | Insights + ProfileGPU | Frame-level CPU + GPU correlation |
| "Where are my draws coming from?" | RenderDoc (mesh viewer) | RenderDoc shows pre-VS geometry |
| "Why does my shader behave wrong?" | RenderDoc (HLSL stepping) | Line-by-line debug at any pixel |
| "D3D12 PSO state debugging" | PIX | D3D12-specific tooling |
| "Cross-API project (Vulkan + DX)" | RenderDoc | Single tool covers both |
| "Memory residency / file IO timeline" | PIX (timing capture) | RenderDoc focuses on graphics work |
| "NVIDIA RT shader profiling" | Nsight Graphics | SM-level RT counters (see Nsight tutorial) |
| "AMD wave occupancy" | RGP (see AMD vendor tools) | RDNA-specific occupancy view |
Most UE5 engineers keep all three installed. RenderDoc is the most general-purpose; reach for it first when the question is "what is happening" rather than "how long is it taking."
PerfGuard regression reports surface per-pass GPU timing deltas — when one of those flags a regression, RenderDoc is the natural drill-down: capture the regression scene, walk the Event Browser, find the new draws.
- PIX on Windows — the D3D12 sibling tool.
- NVIDIA Nsight Graphics — SM-level NVIDIA-specific debugging.
- AMD Vendor Tools — RGP, RMV, RRA for RDNA work.
- Unreal Insights From Zero — the CPU/timing complement.