<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>UE5 on MrOptimist</title><link>https://mr0ptimist.github.io/tags/ue5/</link><description>Recent content in UE5 on MrOptimist</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mr0ptimist.github.io/tags/ue5/index.xml" rel="self" type="application/rss+xml"/><item><title>UE5 Nanite 与传统渲染管线的深度源码对比</title><link>https://mr0ptimist.github.io/posts/ue5-nanite-%E4%B8%8E%E4%BC%A0%E7%BB%9F%E6%B8%B2%E6%9F%93%E7%AE%A1%E7%BA%BF%E7%9A%84%E6%B7%B1%E5%BA%A6%E6%BA%90%E7%A0%81%E5%AF%B9%E6%AF%94/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://mr0ptimist.github.io/posts/ue5-nanite-%E4%B8%8E%E4%BC%A0%E7%BB%9F%E6%B8%B2%E6%9F%93%E7%AE%A1%E7%BA%BF%E7%9A%84%E6%B7%B1%E5%BA%A6%E6%BA%90%E7%A0%81%E5%AF%B9%E6%AF%94/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文基于 UE 5.4/5.5 引擎源码，从源码层面深入对比 Nanite 渲染管线与传统网格渲染管线的差异。所有代码引用均标注了引擎内的原始路径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="1-宏观架构概览"&gt;1. 宏观架构概览&lt;/h2&gt;
&lt;p&gt;传统渲染管线和 Nanite 管线的最根本区别在于：&lt;strong&gt;几何处理的主导权从 CPU 转移到了 GPU&lt;/strong&gt;，并且&lt;strong&gt;材质着色从 Pixel Shader 迁移到了 Compute Shader&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;传统渲染 (Traditional)&lt;/th&gt;
&lt;th&gt;Nanite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;几何裁剪&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU-driven Frustum/Occlusion Culling&lt;/td&gt;
&lt;td&gt;GPU-driven Cluster Culling + Two-Pass Occlusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LOD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;离散 LOD (StaticMesh LOD0~N)&lt;/td&gt;
&lt;td&gt;连续 LOD (Cluster Hierarchy, Runtime Streaming)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;光栅化&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;硬件光栅化 (Fixed Function RS)&lt;/td&gt;
&lt;td&gt;软件光栅化 (Compute) + 硬件光栅化 (Mesh/Prim Shader)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;中间表示&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;无 (直接写 GBuffer/FrameBuffer)&lt;/td&gt;
&lt;td&gt;Visibility Buffer (VisBuffer64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;材质着色&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pixel Shader (&lt;code&gt;BasePassPixelShader.usf&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Compute Shader (&lt;code&gt;ComputeShaderOutputCommon.ush&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GBuffer 输出&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SV_Target&lt;/code&gt; MRT&lt;/td&gt;
&lt;td&gt;UAV (&lt;code&gt;ComputeShadingOutputs.OutTargetN&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DrawCall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FMeshDrawCommand&lt;/code&gt; (CPU 组装)&lt;/td&gt;
&lt;td&gt;Indirect Dispatch (GPU 驱动)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="2-渲染入口与调度"&gt;2. 渲染入口与调度&lt;/h2&gt;
&lt;h3 id="21-传统渲染的入口"&gt;2.1 传统渲染的入口&lt;/h3&gt;
&lt;p&gt;传统渲染的顶层调度在 &lt;code&gt;FDeferredShadingSceneRenderer::Render()&lt;/code&gt; 中，通过 &lt;code&gt;RenderBasePass()&lt;/code&gt; 等函数发起。每个 &lt;code&gt;FPrimitiveSceneProxy&lt;/code&gt; 会在 &lt;code&gt;FMeshPassProcessor&lt;/code&gt; 中被转换为 &lt;code&gt;FMeshDrawCommand&lt;/code&gt;，最终由 &lt;code&gt;FParallelMeshDrawCommandPass&lt;/code&gt; 提交到 RHI。&lt;/p&gt;</description></item></channel></rss>