mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
5132 字
16 分钟
UE5 渲染管线 04:Desktop Deferred 一帧逐 Pass 地图
2026-07-16
NOTE

系列导航:00 总览01 线程与 Scene Proxy02 可见性与 Mesh Drawing03 RDG04 Deferred Frame05 Nanite。版本基线为 UE 5.8 Desktop Deferred。

先给结论#

理解 UE5 的一帧,最稳妥的方法不是背 GPU Capture 中的 Pass 排列,而是追踪核心资源:

谁生产 SceneDepth?
谁生产 GBuffer 与 Velocity?
谁消费 Depth / GBuffer 得到 Shadows、GI、Reflections 和 Lighting?
SceneColor 在哪一步仍是 HDR / Pre-Exposed?
Temporal History 何时读入、何时写回?
内部渲染分辨率在哪一步变成输出分辨率?

默认 Desktop Deferred 的主干可以概括为:

Scene / View 更新
→ 可见性与几何前端
→ Depth / HZB
→ GBuffer / Velocity
→ Shadows + GI + Reflections + Direct Lighting
→ Atmosphere / Fog / Translucency
→ Temporal Upscale 与 Post Process
→ Tonemap / UI / Present

但它不是固定线性清单。Nanite、Early Z、DBuffer、VSM、Lumen、Hardware RT、Water、Translucency 位置、TSR 和 Async Compute 都会改变实际 RDG 拓扑。

一帧资源依赖总图#

flowchart TD S["FScene + Views + Histories"] V["InitViews / GPU Scene / Visibility"] N["Traditional Meshes + Nanite Cull / Raster"] D["SceneDepth / Stencil"] H["HZB"] DB["DBuffer Decals(可选)"] B["Base Pass / Material Shading"] G["GBuffer + Initial SceneColor"] VE["Velocity"] SH["Shadow Setup / VSM / Shadow Depth"] AO["SSAO / GTAO(路径相关)"] LU["Lumen Scene / GI / Reflections(可选)"] DL["Deferred Direct Lighting"] SC["Lit HDR SceneColor"] AT["Sky / Atmosphere / Clouds / Fog"] TR["Water / Translucency / Separate Translucency"] PP["Exposure / DOF / TSR / Motion Blur / Bloom"] TM["Tonemap / Output Transform"] UI["UI / Back Buffer / Present"] S --> V --> N --> D --> H D --> DB --> B N --> B --> G V --> VE D --> VE V --> SH D --> SH D --> AO G --> AO D --> LU H --> LU G --> LU G --> DL SH --> DL AO --> SC LU --> SC DL --> SC SC --> AT --> TR --> PP --> TM --> UI D --> PP VE --> PP S --> PP

这里把大量子 Pass 合并为功能节点。例如 Lumen 内部有 Scene Update、Surface Cache、Screen Probe Gather、Reflections 和 Temporal Filter;TSR 内部也有多个重投影、Reject、Resolve 与 History Pass。GPU Capture 中不应期待每个框只对应一个事件。

先认清五类资源#

1. Scene Texture#

Renderer 把一组按 View / Scene 配置建立的纹理组织为 Scene Textures,常见语义包括:

  • Scene Depth / Stencil;
  • Scene Color;
  • GBuffer MRT;
  • Velocity;
  • Small Depth / HZB 等派生深度;
  • Custom Depth / Stencil;
  • Mobile 或特定路径的替代布局。

FSceneTexturesConfig 一类配置决定 Extent、Format、Sample Count 与功能开关,FSceneTextures / Scene Texture Parameters 把资源带进 RDG 和 Shader。字段与布局随版本变化,应搜索当前分支而不是照抄旧版结构体截图。

2. Lighting / Shadow 中间资源#

包括 Shadow Depth、VSM Page / Physical Pool、Screen Shadow Mask、Light Grid、Diffuse Indirect、Reflection、AO 等。它们通常不跨帧永久存在,但 VSM Cache、Lumen Scene 与部分 History 有持久外部状态。

3. Temporal History#

TSR / TAA、Lumen、Exposure、Occlusion 与部分降噪器会读取上一时刻状态。History 通常是 External Resource:当前 Graph 注册并读取旧 History,生成新结果,再提取给未来帧。

4. View Uniform 与 Scene GPU Buffer#

View Matrix、Jitter、Pre-Exposure、View Rect、Primitive / Instance Scene Data 等不一定表现为二维纹理,却决定所有 Pass 如何解释坐标和数据。

5. Back Buffer / Output Surface#

最终图像经过 Tonemap、HDR Output Transform、UI Composite 等进入交换链。Back Buffer 的格式、色域、HDR 模式和平台 Present 策略与内部 SceneColor 不同。

View Rect 不等于 Texture Extent#

很多全屏 Shader Bug 来自把 Texture->Desc.Extent 当成当前 View 的有效区域:

Texture Extent:底层资源实际分配尺寸
View Rect:当前 View 在资源中的有效矩形
Screen Percentage:主渲染 View Rect 相对输出尺寸的缩放
Unscaled View Rect:输出 / 目标坐标中的 View 区域

分屏、VR、多 View、Dynamic Resolution、Editor Viewport、Scene Capture 和资源对齐都会让它们不同。Shader 采样应使用 View 提供的 UV Scale / Bias、Buffer Size 与 View Rect 参数,不能只除以纹理宽高。

阶段 0:Scene Update 与 View 准备#

这一阶段在 GPU Capture 中可能分散在 CPU 和 GPU:

  • Game Thread 已把 Component 更新同步给 Renderer Scene;
  • FSceneRenderer 为 View Family 建立 FViewInfo
  • GPU Scene 上传脏 Primitive / Instance 数据;
  • InitViews 计算 Primitive Relevance;
  • Instance Culling 与 Nanite 准备当前 View 的几何工作;
  • View Uniform Buffer 写入 View / Projection、Jitter、Prev Matrix、Pre-Exposure 等。

它生产的不是最终颜色,而是后续所有 Pass 的可见集合和坐标约定。CPU 的 InitViews 很贵时,不能只在 GPU Profile 里找原因。

阶段 1:Depth、Stencil 与 Early Z#

PrePass 的目的#

传统 PrePass 先用简化材质路径写入深度,让后续 Base Pass 对被遮挡像素执行 Early Z Reject。项目可以按平台与内容选择:

  • 不做完整 PrePass;
  • 只画特定 Opaque;
  • Opaque + Masked;
  • 由引擎自动决定;
  • 因 DBuffer、Nanite、Virtual Texturing 或其他功能而需要额外深度工作。

PrePass 是额外几何工作,只有当它减少的 Pixel Shader / Overdraw、提供的 Depth 依赖或其他功能收益超过成本时才划算。

Nanite 与 Scene Depth#

Nanite 通过自身 Cull / Raster 流程产生可见性和深度,再与传统几何形成一致的 Scene Depth 语义。不能在 Capture 中只找一条名为 PrePass 的 Draw Event 来代表全部深度生产者。

Stencil 不只是遮罩#

Stencil 位可能被 Shading Model、Lighting Channel、Decal、Custom Depth、Hair、Substrate 或其他功能使用。具体 Bit Packing 是版本和路径细节;自定义 Pass 不应占用“看起来没用”的 Stencil Bit 而不检查当前平台定义。

Depth 的消费者#

  • HZB 构建;
  • Base Pass Depth Test;
  • Occlusion / Instance / Nanite Culling;
  • DBuffer Decals;
  • Screen Space Traces;
  • SSAO / GTAO;
  • Shadow Page Marking;
  • Translucency Depth Test;
  • DOF、Motion Blur、TSR、Fog 等 Post Process。

阶段 2:HZB#

HZB 从 Depth 建立 Mip 金字塔。不同消费者可能需要当前或历史 HZB:

  • Primitive / Instance Occlusion;
  • Nanite Cluster Occlusion;
  • Lumen Screen Traces;
  • Screen Space Reflections / AO;
  • VSM Page 或其他屏幕覆盖判断。

Capture 中可能存在多个 HZB、Furthest / Closest 语义或不同 View 的 HZB。必须从资源名、Format、Extent 和消费者确认,不能看到 HZB 字样就认定是同一张纹理。

阶段 3:DBuffer Decals(可选)#

DBuffer Decal 通常在 Base Pass 前读取 Scene Depth,把 Decal 属性写进独立 DBuffer;Base Pass 再读取并合并到材质输出。这让 Decal 能影响静态 / 间接光照相关材质属性,但引入:

  • 对完整或足够 Depth 的依赖;
  • DBuffer MRT 带宽与显存;
  • Base Pass 额外读取和 Material Permutation;
  • 大屏幕覆盖 Decal 的 Overdraw。

其他 Decal 路径可能在 Base Pass 后直接修改 GBuffer / SceneColor,实际阶段取决于 Decal Blend / Material 与平台支持。

阶段 4:Base Pass 与 GBuffer#

Base Pass 写什么#

Desktop Deferred 的 Opaque / Masked 材质在 Base Pass 把表面属性写入多 Render Target。稳定语义通常包括:

  • World / View Space Normal 的编码;
  • Base Color;
  • Metallic、Specular、Roughness;
  • Shading Model 与 Selective Output Mask;
  • Material AO;
  • Shading Model 专用 Custom Data;
  • Precomputed Lighting / Shadow 相关数据(配置相关);
  • 初始 HDR SceneColor 或与静态光照相关的贡献;
  • Velocity 可能在此写入,也可能走其他阶段。

不要死记 GBufferA.R 之类通道:Packing 会受平台、精度设置、Static Lighting、Substrate、DBuffer、Velocity 配置和版本影响。正确检查方式是:

  1. Buffer Visualization 看语义;
  2. RenderDoc / PIX 看实际 Render Target Format;
  3. 搜索当前分支 GBuffer Encoding / Decode Shader;
  4. 通过 FSceneTextureParameters 或标准 Material Helper 读取。

为什么 Deferred 适合很多动态灯#

Base Pass 只把材质表面属性写入 GBuffer,后续每盏灯读取 GBuffer 做光照,不必为每个材质 × 每盏灯重新执行完整材质 Shader。代价是:

  • GBuffer 带宽与显存较大;
  • MSAA 支持复杂;
  • 透明物体通常不能直接使用同一 Deferred GBuffer 模型;
  • 材质与 Lighting Model 受 GBuffer 编码约束。

阶段 5:Velocity#

Velocity / Motion Vector 表达当前像素从上一帧到当前帧的位置变化,TSR、TAA、Motion Blur、Temporal Denoiser 等依赖它。

项目可配置 Velocity 在 Depth Pass、Base Pass 或其后单独 Pass 写入。选择影响:

  • 几何是否重复提交;
  • Masked / WPO 材质执行成本;
  • Base Pass MRT 带宽;
  • 静态对象是否需要写 Camera Motion;
  • Nanite、Skeletal Mesh、Vertex Deformation 的支持路径。

错误 Velocity 的症状不只拖影,也可能是:

  • 细节闪烁;
  • 遮挡显露区域历史错误;
  • WPO 物体留下残影;
  • Camera Cut 后短暂污染;
  • TSR History Rejection 过多导致不稳定。

阶段 6:Shadow Setup、Shadow Depth 与 VSM#

阴影支路可能在 Frame Graph 中与 Depth / Base Pass 交错,因为不同工作依赖不同输入:

  • CPU / GPU 选择投影光源和 Shadow Caster;
  • VSM 根据屏幕需求标记 Virtual Page;
  • 分配或复用 Physical Page;
  • 只为需要更新的 Page 渲染 Nanite / 非 Nanite Shadow Caster;
  • 传统 Shadow Map / CSM / One-Pass Point Light 等走其他路径;
  • Lighting 阶段采样阴影表示得到可见性。

VSM Cache 是跨帧状态,移动光、WPO、动画或 Primitive 更新可能让 Page 失效。Shadow GPU 时间必须同时解释“本帧渲染多少页”和“为什么缓存失效”。

阶段 7:AO、Lumen GI 与 Reflections#

AO 支路#

SSAO / GTAO 等通常读取 Depth、Normal 和历史数据,生成局部遮蔽。启用 Lumen 后,AO 与间接光组合策略会变化;不能简单把 AO Pass 与 Lumen Diffuse Indirect 数值相加当作最终间接光。

Lumen 支路#

Lumen 不是一个 Pass。典型工作包括:

  • 更新 Lumen Scene / Surface Cache;
  • Screen Trace;
  • Software 或 Hardware Ray Tracing;
  • Screen Probe Gather;
  • Radiance Cache;
  • Diffuse Indirect Temporal / Spatial Filter;
  • Reflections Trace、Resolve 与 Denoise;
  • 把 GI / Reflections 合成进 SceneColor 或 Lighting 结果。

Screen Trace 依赖当前 Depth / GBuffer / HZB;Scene Trace 依赖 Lumen Scene 或 Ray Tracing Scene;Temporal Filter 依赖 History。因此 Lumen 问题必须按“屏幕数据—场景表示—缓存—历史”分层定位。

阶段 8:Deferred Direct Lighting#

Direct Lighting 通常读取:

  • GBuffer Material 与 Normal;
  • Scene Depth / World Position 重建参数;
  • Light Data / Light Grid;
  • Shadow Mask、VSM 或 Ray Traced Shadow;
  • Lighting Channels、Shading Model 与 Hair / Substrate 分类;
  • AO、Sky Lighting、Reflection Environment 等相关输入。

然后以 Fullscreen、Light Volume、Tiled / Clustered 或 Compute 等方式把光累加到 HDR SceneColor。不同光类型和平台可能走不同实现,因此一个名为 Lights 的父事件下会出现多个 Draw / Dispatch。

HDR SceneColor 与 Pre-Exposure#

UE 会在写入 SceneColor 时使用 Pre-Exposure,把 HDR 数值缩放到更适合当前格式与计算精度的范围。它通常来自已有的 Exposure 状态,而 Eye Adaptation 又根据图像统计更新未来使用的 Exposure。

因此自定义 Shader 读写 SceneColor 时必须遵守 Pre-Exposure 约定:

  • 不能假设 SceneColor 中的数值就是绝对物理亮度;
  • 合成外部纹理时要确认它是否已 Pre-Exposed;
  • 跨帧 History 需要处理 Exposure 比例变化;
  • Debug Capture 的数值应结合 View 的 PreExposure 解读。

阶段 9:Sky、Atmosphere、Cloud 与 Fog#

这些效果不总是简单排在“Lighting 后面”:

  • Sky Atmosphere 可能生成 LUT,并在不同阶段合成;
  • Volumetric Cloud 有自己的 Trace、Shadow 与 Temporal History;
  • Exponential Height Fog 与 Volumetric Fog 使用不同数据;
  • Fog 需要正确处理 Opaque Depth、Translucency 和 Sky;
  • Aerial Perspective 可能在材质或后处理阶段应用。

用资源依赖判断:它读 Scene Depth / SceneColor / Lighting 的哪个版本,产出又被哪类 Translucency 或 Post Process 消费。

阶段 10:Water 与 Translucency#

透明物体通常不能像 Opaque 一样把唯一表面写进 GBuffer,因为一个像素可能有多层透明表面。常见路径包括:

  • Standard Translucency;
  • Separate Translucency;
  • Before / After DOF Translucency;
  • Single Layer Water;
  • Hair / Volumetric / Niagara 专用路径;
  • Distortion、Refraction 与 Translucency Lighting Volume。

其成本容易受屏幕覆盖、Overdraw、材质复杂度和分辨率放大。TSR 前后渲染的 Translucency 还需要不同的 History / Responsive 策略。

阶段 11:Post Process 与 Temporal Upscale#

Post Process 是一个依赖图,典型节点包括:

  • Eye Adaptation / Local Exposure;
  • Depth of Field;
  • Temporal Upscaler(TSR / TAAU);
  • Motion Blur;
  • Bloom、Lens Flare;
  • Color Grading / Tonemap;
  • Chromatic Aberration、Vignette、Film Grain;
  • Spatial Upscale / Sharpen;
  • User Post Process Material;
  • HDR Output Transform。

顺序会受 Blendable Location、Translucency Pass、AA 方法、Primary / Secondary Upscale 和平台改变。自定义 Post Process Material 必须明确它插入 Tonemap 前还是后、输入分辨率和颜色空间是什么。

TSR 的核心输入输出#

flowchart LR C["当前低分辨率颜色"] D["Depth"] V["Velocity"] E["Exposure / Pre-Exposure"] H["上一帧 TSR History"] R["Reprojection / History Rejection"] U["高分辨率重建结果"] NH["新 TSR History"] C --> R D --> R V --> R E --> R H --> R R --> U R --> NH

TSR 要解决的不只是放大,还包括:

  • Jitter Sample 的时域整合;
  • History Reprojection;
  • Disocclusion / Shading Change 检测;
  • Anti-Aliasing;
  • Detail Reconstruction;
  • History 格式与分辨率管理。

降低 Screen Percentage 会减少 TSR 前许多 Pass 的像素成本,但输入信息也随之减少;TSR 自身和部分后处理可能在接近输出分辨率运行。不能假设所有 GPU Pass 都按 Screen Percentage 的平方等比缩放。

阶段 12:Tonemap、UI 与 Present#

Tonemap 把 Pre-Exposed HDR SceneColor 映射到目标显示范围,并结合 Exposure、Color Grading、Film Curve 与输出设备变换。Tonemap 后的值不再适合当作线性 HDR Lighting 数据使用。

随后可能发生:

  • After Tonemap Post Process;
  • Secondary Spatial Upscale;
  • Slate / UMG / Debug Canvas 合成;
  • HDR UI 亮度处理;
  • Copy / Resolve 到 Back Buffer;
  • Swap Chain Present 与 VSync。

GPU Present 时间高不一定是一个昂贵 Shader,也可能是在等待 VSync、Frame Pacing 或交换链。

条件化 Pass:为什么两台机器的 Capture 不一样#

条件主要变化
Nanite 开 / 关几何 Cull / Raster、Depth 与材质阶段的组织不同
Early Z 模式PrePass 覆盖范围、Masked 重复工作、Base Pass Overdraw 不同
DBuffer DecalsBase Pass 前增加 DBuffer 写入与读取
Velocity Pass 位置Depth / Base / Separate Pass 的 MRT 与几何成本变化
VSM vs CSM / Traditional ShadowPage Marking、Cache、Shadow Depth 组织不同
Lumen vs SSAO + Reflection CaptureGI / Reflection 分支和 History 完全不同
Software vs Hardware LumenScene Trace 表示与 Ray Tracing Pass 不同,但 Screen Trace / Cache 可能仍在
TSR / TAA / FXAA / NoneTemporal History、Velocity 依赖和 Upscale 位置不同
Screen Percentage / Dynamic Resolution各 Pass Extent 和 History 重分配不同
SubstrateMaterial Classification、GBuffer / Tile 与 Lighting 路径改变
Forward Renderer不再使用同一 Desktop Deferred GBuffer / Lighting 主线
Scene Capture / Reflection CaptureView State、History、Show Flags 和输出目标不同

比较 Capture 前必须把 Project Settings、Console Variables、RHI、分辨率和平台写入实验记录。

用 GPU Capture 给资源建立“户口本”#

对每个核心纹理记录:

字段示例问题
RDG / RHI 名称它在 Capture 中叫什么?是否每帧稳定?
DescriptorFormat、Extent、Mip、Array、Flags 是什么?
有效 View Rect实际只使用资源的哪一块?
第一个生产者Clear、Raster 还是 Compute?
所有消费者哪些 Pass 读 SRV / UAV / Attachment?
最后使用点何时可被释放或 Alias?
是否 External / Extracted是否跨 Graph / 跨帧?
是否 HistoryCamera Cut / Resize 时怎样失效?
Pre-Exposure / Color Space数值怎样解释?

先为 SceneDepth、主要 GBuffer、VelocitySceneColor 和 TSR History 建五张卡片,就能解释大半帧图。

源码阅读地图#

入口常见目录 / 文件要回答的问题
FDeferredShadingSceneRenderer::RenderDeferredShadingRenderer.cpp主 Graph 怎样按 Feature 分支组装?
Scene Texture 配置SceneTexturesConfig.*SceneTextureParameters.*Extent、Format 与参数怎样确定?
DepthDepthRendering.*哪些 Primitive 进入 PrePass,使用什么 Material Shader?
HZB搜索 BuildHZB / HZB谁生产每种 HZB,谁消费?
Base PassBasePassRendering.*GBuffer、SceneColor、DBuffer 怎样绑定?
VelocityVelocityRendering.*本配置在哪个阶段写 Velocity?
DecalsDeferredDecals.*DBuffer 与其他 Decal Stage 怎样分支?
ShadowsShadowSetup.*ShadowDepthRendering.*Caster 选择和 Shadow Depth 怎样产生?
VSMVirtualShadowMaps/Page Mark、Allocate、Render、Cache 在哪?
LumenLumen/Scene Update、GI、Reflection 的 RDG 边是什么?
LightingDeferredLighting.*LightRendering.*Light Grid、Shadow 与 GBuffer 怎样合成?
Atmosphere / Fog对应 SkyAtmosphereVolumetric* 文件LUT、History 与 SceneColor 在哪合成?
TranslucencyTranslucentRendering.*Before / After DOF 与 Separate 路径怎样组织?
Post ProcessPostProcess/PostProcessing.*Post Graph 与 Blendable Location 怎样建立?
TSRPostProcess/TemporalSuperResolution.*History、Reject、Resolve 与输出 Rect 是什么?
Tonemap / ExposurePostProcess/Tonemap.*EyeAdaptation.*Pre-Exposure 怎样进入最终输出?

文件名会随版本调整。最有效的追踪方式是从 GPU Event 名在源码搜索 RDG_EVENT_NAME,再反向找输入资源和调用方。

GPU Capture 对齐步骤#

  1. 固定相机、分辨率、Screen Percentage、VSync、帧率上限和 Dynamic Resolution。
  2. 等待 Shader / PSO、Texture Streaming、Nanite Streaming、Lumen / VSM Cache 与 Exposure 稳定。
  3. ProfileGPU 找大类,用 RenderDoc / PIX / RGP / Nsight 打开具体资源与 Dispatch。
  4. 记录 Capture Frame 的 RHI、Feature Level、Project Settings 和关键 CVar Dump。
  5. SceneDepth → GBuffer → SceneColor → TSR Output → Back Buffer 追五条资源链。
  6. 每次只切换一个 Feature,再在同一相机重抓。
  7. GPU Queue 有重叠时,不把各 Event Duration 简单相加当作总帧时间。

Capture 工具会扰动 Barrier、Transient Aliasing、并行提交和时序;它适合解释工作,不一定提供最无扰动的性能数字。性能结论需与多帧统计和平台 Profiler 交叉验证。

七个可证伪实验#

H1:Early Z 是否值得取决于 Pixel Cost 与 Overdraw#

准备低 Pixel Cost / 高几何量和高 Pixel Cost / 高 Overdraw 两组场景,分别改变 Early Z 模式。记录 PrePass、Base Pass、总 GPU、Triangles 与 Pixel Shader Invocation。

预期:完整 PrePass 增加几何成本,但在高 Overdraw + 昂贵材质时可能降低总时长;不存在“永远打开更快”的结论。

H2:DBuffer 把 Decal 工作放到 Base Pass 之前#

固定一组覆盖大屏幕的 Decal,分别使用进入 DBuffer 与不进入 DBuffer 的合法配置。观察 DBuffer 资源、PrePass 依赖、Base Pass 输入和 Decal GPU 时间。

预期:DBuffer 配置产生 Base Pass 前的属性缓冲并被 Base Pass 消费;具体效果与材质 Blend 支持有关。

H3:Velocity Pass 位置改变几何与 MRT 成本#

在运动 Static Mesh、Skeletal Mesh 和 WPO Mesh 上分别测试 Velocity 写入位置。检查 Velocity 生产者、Base Pass Render Targets、重复 Draw 与 TSR Visualization。

预期:Pass 拓扑和带宽改变,但最终正确 Motion Vector 应保持一致;若 WPO 缺失,检查 Previous Frame Switch / Material 设置和路径支持。

H4:Screen Percentage 只缩放部分 Pass#

固定 4K 输出,分别测试 50%、67%、77%、100% Primary Screen Percentage。记录每个核心资源 Extent 与 Pass 时间。

预期:Depth、GBuffer、Lighting 等主渲染 Pass 随内部尺寸变化;TSR 与部分 Post 在更高或输出分辨率运行,不会全部按像素数同率缩放。

H5:关闭 Lumen 会替换一条分支,不会删除整个 Lighting#

用固定灯光与材质切换 Lumen GI / Reflection 到一个明确的非 Lumen 对照。比较 GBuffer、Direct Lighting、GI、Reflection、SceneColor。

预期:几何与 Direct Lighting 主干仍存在,GI / Reflection 分支和结果改变。

H6:View Rect 错误会在分屏 / Dynamic Resolution 暴露#

实现一个测试 Fullscreen RDG Pass,先错误地用 Texture Extent 生成 UV,再改为 View 参数。分别在单 View、分屏和非 100% Screen Percentage 测试。

预期:错误实现出现偏移、串 View 或边缘采样;使用 View Rect / UV Scale Bias 后恢复。

H7:Pre-Exposure 错误会随曝光变化闪烁#

把一个固定亮度外部纹理合成到 Tonemap 前,分别使用错误的绝对数值和正确 Pre-Exposure 转换。让相机从室内走到室外。

预期:错误路径相对场景亮度漂移或闪烁;正确路径在 Exposure 变化中保持预期关系。

故障定位表#

症状优先检查资源 / 阶段
Opaque 物体转角消失Bounds → Primitive / Nanite Culling → SceneDepth
材质看起来完全错误GBuffer Visualization → Shading Model → Base Pass Permutation
动态物体拖影Velocity → Depth → TSR Reject / History
阴影偶发暴涨VSM Page / Cache Invalidations → Shadow Caster
间接光漏光 / 黑面Lumen Scene / Surface Cache → Screen Trace → Scene Trace
透明物体糊或排序错Translucency Pass 位置 → Depth / Velocity → TSR
后处理在分屏串色View Rect / UV Scale Bias → Scene Texture Extent
室内外切换亮度闪烁Pre-Exposure → Eye Adaptation History → Tonemap
Screen Percentage 降低却没快找不随内部分辨率缩放的 Pass、CPU / Geometry / Bandwidth 瓶颈
Present 很高VSync / Swap Chain / Frame Pacing,不先改 Shader

本篇建立的心智模型#

几何前端生产 Depth / GBuffer / Velocity
→ Shadows、AO、Lumen、Direct Lighting 消费它们
→ 得到 Pre-Exposed HDR SceneColor
→ Atmosphere / Fog / Translucency
→ Temporal History + Post Process
→ Tonemap / Output Transform
→ UI / Back Buffer / Present

下一篇单独拆 Nanite:Cluster Hierarchy 怎样选择细节,Two-Pass Occlusion 为什么需要 HZB,Hardware / Software Raster 如何协作,Streaming Page 与 Material Shading 又怎样回到本篇的 Depth 和 GBuffer 主线。

官方资料#

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

UE5 渲染管线 04:Desktop Deferred 一帧逐 Pass 地图
https://example.pages.dev/posts/ue5-rendering-pipeline/04-deferred-frame/
作者
博主
发布于
2026-07-16
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录