Primer 04 — Deferred Shading
一枚の絵はどう組み立てられるか / How a frame is assembled

描画パスと
デファードシェーディング

Primer 03 でシェーダーが1ピクセルの色を計算するのを見ました。ではライトが100個ある夜景を、全部の面×全部のライトで計算したら? ── 破綻します。UE の既定デファードシェーディングは、いったん「素材の情報だけ」を画面に書き出し(G-Buffer)、そのあとで光をまとめて一度だけ計算します。その分業を、実際にチャンネルを分解して見ていきます。

Render Pass G-Buffer Deferred Forward
まず用語だけ — 読む前の30秒
描画パス render pass
1枚の絵を作る途中の「工程」。何段も重ねて最終画像になる。
G-Buffer geometry buffer
色・法線・深度…を別々に書き出した中間画像の束。光の計算前の素材。
デファード deferred
「後回し」の意。素材を先に書き、光は後でまとめて計算する方式。UE既定。
フォワード forward
面を描くその場で光も計算する素直な方式。VR等で使う。
法線 normal
面が向いている方向。光の当たり方の計算に必須。RGBで向きを表す。
深度 depth
カメラからの距離。手前/奥の判定や位置の復元に使う。
※ 各語の詳しい定義は、ページ末尾の用語集にもあります。

§1 — Why defer

「その場で光を計算」の限界

素直なやり方(フォワード)は、面を描くたびにその面に当たる全ライトを計算します。分かりやすいけれど、面の数 × ライトの数で計算量が膨らみ、しかも奥の面を手前が上書きすると、その光の計算は丸ごと無駄になります。デファードは「まず見えている面の素材だけ確定させ、光はそのあと画面一回ぶんだけ」に変えて、この掛け算を足し算に近づけます。

FORWARD / 素直
描きながら光らせる
コスト ≒ 面数 × 光数。半透明やMSAAに強く、VRで好まれる。多光源は苦手。
DEFERRED / 後回し
素材→まとめて光
コスト ≒ 面数 + 光数。多数のライトに強い。半透明は別処理が要る。UEの既定

§2 — Peek inside

G-Buffer を分解して見る

デファードの中間画像=G-Bufferは、1枚の絵ではなく複数のチャンネルの束です。下のシーン(床+球3つ)を各チャンネルに切り替えてみてください。アルベド・法線・深度・粗さは、まだ光を当てていない材料です。「合成」を押すと、これらを使って光を1回計算した最終結果になります。

UEでは Viewmode → Buffer VisualizationBase Color / World Normal 表示で、これと同じチャンネルを実機で覗けます。バグ調査(法線が裏返る、粗さがおかしい等)は、まずこの分解表示で原因のチャンネルを特定するのが定石です。


§3 — The lighting pass

なぜライトを増やしても耐えるのか

G-Buffer が揃うと、各ライトは「自分が照らす画面の範囲」についてだけ、そこに既に書いてある素材情報を読んで光を足します。面の三角形を描き直す必要がないので、追加コストはおおむねライトが画面を覆う面積で決まります。小さな点光源を大量に置いても、それぞれが画面のごく一部しか触らなければ安い ── これがデファードの勝ち筋です。

1
Base Pass
見えている面だけをG-Bufferへ書き出す。色・法線・深度・粗さを記録。光はまだ。
2
Lighting Pass
各ライトが覆う画面範囲だけ、G-Bufferを読んで光を加算。ライト数に強い核心。
3
Post / 半透明
半透明はG-Bufferに乗らないので後段でフォワード合成。さらにブルーム等のポスト処理。

半透明(ガラス・煙)が「奥の一枚」に畳めないのは、複数の面の色が重なって見えるから。だからデファードでも半透明だけはフォワードで別に描きます。「半透明が多いと重い」と言われる背景がこれです。


§4 — In UE

UEでの実際 ── パスを覗く・測る

UEの1フレームは、ここで見た Base Pass / Lighting のほかに、シャドウ・SSAO・SSR・半透明・ポストと何十ものパスが積み重なっています。どのパスが重いかは実測でしか分かりません。下は最初に触るツールです。

Buffer Visualization
中身を目で見る
ビューポートのViewmodeから、§2でやったチャンネル分解を実機で表示。破綻の切り分けに。
GPU Visualizer
パス毎の時間
Ctrl+Shift+, で、各パスが何msかかったかを一覧。重いパスを名指しできる。
Forward / Lumen
方式の選択
VR等はForward Rendererを選択可。UE5のLumen/Naniteもこのパス構成の上で動く発展形。

Primer 01 で「レンダースレッドがGPUに命令を積む」と言いました。その命令列の正体が、この描画パスの連なりです。4本を通して、ゲームスレッド→レンダースレッド→GPU→テクスチャ→マテリアル→描画パス、と一周したことになります。


Glossary — 用語

よく出る言葉