欢迎光临
我们一直在努力

延迟渲染管线:G-Buffer 多 Pass 机制与工程权衡

开场

周五晚上十点,你往 Unity 场景里塞了 200 个点光源做夜景测试。Frame Debugger 一看——渲染线程直接红温,Draw Call 飙升到几千。这时候老司机路过瞄了一眼:Render Path 还停在 Forward?切 Deferred 啊。

你切过去,帧率从 22 飙到 78。但新问题也来了:显存多占了几十 MB,半透明物体渲染不对,MSAA 直接灰掉。这背后到底发生了什么?这篇文章把 Forward 为什么会炸、Deferred 怎么救场、以及它三个代价的真正成因,逐层讲透。

一、先看病灶:Forward 为什么在多光源下爆炸

要理解延迟渲染的价值,得先看清前向渲染(Forward Rendering)的成本结构。

Forward 是\”边画几何边算光\”:每个物体光栅化时,在片元着色器里对所有影响它的光源做光照计算。问题在于两件事:

  • 复杂度是 O(物体数 × 光源数)。Unity 的 Forward 路径里,像素光源超出每物体限额后,多出来的灯要靠 ForwardAdd pass 再画一遍物体——一盏灯一遍 Draw Call,200 盏灯照 20 个物体就是 4000 次额外绘制。光源数和 Draw Call 是乘法关系,这就是你看到的 4000+。
  • Overdraw 下的光照全是无用功。被遮挡的像素照样算完了光照,深度测试之后才被丢弃。场景越复杂,浪费越大。
  • 所以 Forward 的死结是结构性的:光照开销跟着\”物体 × 灯\”走,而你真正需要的只是\”屏幕上每个像素的最终颜色\”

    赞(0)
    未经允许不得转载:171主机测评 » 延迟渲染管线:G-Buffer 多 Pass 机制与工程权衡
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址