<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://isakwong.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://isakwong.github.io/" rel="alternate" type="text/html" /><updated>2026-03-15T04:24:38+00:00</updated><id>https://isakwong.github.io/feed.xml</id><title type="html">IsakWong</title><subtitle>Game &amp; Engine Developer | 游戏与引擎开发者，个人作品集与技术博客</subtitle><author><name>IsakWong</name><email></email></author><entry><title type="html">延迟渲染 vs 前向渲染：实践对比与思考</title><link href="https://isakwong.github.io/blog/2026/03/14/hello-world/" rel="alternate" type="text/html" title="延迟渲染 vs 前向渲染：实践对比与思考" /><published>2026-03-14T00:00:00+00:00</published><updated>2026-03-14T00:00:00+00:00</updated><id>https://isakwong.github.io/blog/2026/03/14/hello-world</id><content type="html" xml:base="https://isakwong.github.io/blog/2026/03/14/hello-world/"><![CDATA[<p>在实现自研渲染器的过程中，我分别实现了前向渲染（Forward Rendering）和延迟渲染（Deferred Rendering）两套管线。本文记录一下实践中的思考和对比。</p>

<h2 id="前向渲染">前向渲染</h2>

<p>前向渲染是最直观的方式：对每个物体，遍历所有影响它的光源，一次完成着色。</p>

<div class="language-hlsl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Forward shading - 每个物体遍历所有光源</span>
<span class="kt">float4</span> <span class="nf">ForwardPS</span><span class="p">(</span><span class="n">VSOutput</span> <span class="n">input</span><span class="p">)</span> <span class="o">:</span> <span class="n">SV_Target</span> <span class="p">{</span>
    <span class="kt">float3</span> <span class="n">color</span> <span class="o">=</span> <span class="kt">float3</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numLights</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">color</span> <span class="o">+=</span> <span class="n">CalcLight</span><span class="p">(</span><span class="n">lights</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">input</span><span class="p">.</span><span class="n">normal</span><span class="p">,</span> <span class="n">input</span><span class="p">.</span><span class="n">worldPos</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="kt">float4</span><span class="p">(</span><span class="n">color</span><span class="p">,</span> <span class="mi">1</span><span class="p">.</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>优势：</strong> 实现简单，支持透明物体和 MSAA。<br />
<strong>劣势：</strong> 复杂度为 O(物体数 × 光源数)，光源多时性能惥崖。</p>

<h2 id="延迟渲染">延迟渲染</h2>

<p>延迟渲染将几何信息和光照计算分离：</p>

<ol>
  <li><strong>Geometry Pass</strong> — 把法线、深度、反射率等写入 G-Buffer</li>
  <li><strong>Lighting Pass</strong> — 在屏幕空间对每个像素计算光照</li>
</ol>

<div class="language-hlsl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// G-Buffer output</span>
<span class="k">struct</span> <span class="n">GBufferOutput</span> <span class="p">{</span>
    <span class="kt">float4</span> <span class="n">albedo</span>   <span class="o">:</span> <span class="n">SV_Target0</span><span class="p">;</span>
    <span class="kt">float4</span> <span class="n">normal</span>   <span class="o">:</span> <span class="n">SV_Target1</span><span class="p">;</span>
    <span class="kt">float4</span> <span class="n">position</span> <span class="o">:</span> <span class="n">SV_Target2</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p><strong>优势：</strong> 复杂度为 O(屏幕像素 × 光源数)，光源数量对性能影响小。<br />
<strong>劣势：</strong> 占用显存大，透明物体处理比较麻烦，不能直接用 MSAA。</p>

<h2 id="实践中的取舍">实践中的取舍</h2>

<p>在我的渲染器里，最终采用了 <strong>Deferred + Forward</strong> 的混合方案：</p>

<ul>
  <li>不透明物体走 Deferred 管线</li>
  <li>透明物体（特效、玻璃）走 Forward 管线</li>
</ul>

<p>这也是大多数现代引擎（UE5、Unity HDRP）的做法。</p>

<hr />

<p>下一篇将分享 Cascaded Shadow Maps 的实现细节。</p>

<hr />

<p>感谢访问，欢迎常来！</p>]]></content><author><name>IsakWong</name></author><category term="渲染" /><summary type="html"><![CDATA[在实现自研渲染器的过程中，我分别实现了前向渲染（Forward Rendering）和延迟渲染（Deferred Rendering）两套管线。本文记录一下实践中的思考和对比。]]></summary></entry></feed>