遅延シェーディング

遅延シェーディング  は2次元のスクリーンスペース上でシェーディングを行なう技術である。遅延と呼ばれるのは最初にジオメトリを処理する頂点シェーダーからピクセルシェーダーに至るまでの第1パスでシェーディングが実際に実行されていないからである。かわりにシェーディングは第1パスの結果を使ってレンダリングされる第2パスまで「遅延」される。

遅延シェーダーの第1パスでは、最終的なシェーディングに必要とされるデータがいったん収集されるのみとなる。各表面の位置や法線、マテリアルといった幾何学情報は、1組のテクスチャとしてジオメトリバッファ  にレンダリングされ、2次元情報として保存される。この後、ピクセルシェーダーは、スクリーンスペースにおいてテクスチャバッファの情報を使うピクセルごとに直接あるいは間接照明を演算する。

スクリーンスペース・ディレクショナルオクルージョンは直接影や反射を与えるという目的で遅延シェーディングのパイプラインの一部にすることができる。

1. メリット
-------

遅延シェーディングの主なメリットとしては、シーンのジオメトリとライティングの分離が挙げられる。遅延シェーディングの対義語として、従来のレンダリング手順は前方シェーディング  と呼ばれることがあるが、前方シェーディングでは光源の数に応じてジオメトリパスを走らせる必要があり、光源の数に比例してパフォーマンスが低下していく。一方、遅延シェーディングにおいては、光源の数がいくら増えようとも、1つのジオメトリパスのみが要求され、各光源は実際に影響するピクセルに対してのみ計算される。これは深刻なパフォーマンスへの影響なしに、シーンに多くの光源を配置できるということである。この手法ではほかにもいくつかのメリットが論じられている。メリットには、複雑なライティングにおけるリソース管理の容易化・柔軟化、およびCPU・GPU双方におけるソフトウェアレンダリングパイプラインの単純化も含まれうる。

2. デメリット
--------

遅延レンダリングの重要なデメリットとして、アルゴリズムで透明度  を制御できないことが挙げられる。この問題はZバッファを使ったシーンでは一般的な問題ではあるが、シーンの透明部分のレンダリングを最後まで遅らせ、さらに深度ソートすることによって制御・解決されることが多いため、遅延レンダリングとの相性が悪い。 深度剥離法  を用いれば、遅延レンダリングにおける順序非依存の透明度  を実現することができるが、追加バッチとGバッファのコストを犠牲にせざるを得ない。DirectX 10以降をサポートしているハードウェアでは大体バッチを実行してもリアルタイムのフレームレートを十分な速さで維持できる。OITが強く要求される場合においては、遅延シェーディングはそれでもなお同様の技術を用いた前方シェーディングよりも効果的である。

もう1つの深刻なデメリットとして、複数のマテリアルを使うのが困難だということが挙げられる。遅延シェーディングにおいて多数の異なるマテリアルを使うこと自体は可能だが、Gバッファに保存するためにはさらなるデータ領域が要求され、メモリ帯域を消費することになる。

さらにもう1つの深刻なデメリットがある。それはライティングの段階とジオメトリの段階を切り離しているため、ハードウェアアンチエイリアスは一定以上正確な結果を出せないことである。補間されたサブピクセルでは、位置、法線、および接線といった属性は無意味になる。この制限を乗り越えるための通常技術の1つとして、最終画像でポストエフェクトとしてエッジ検出を行ない、エッジをぼかすというものがある。 しかし、近年ではそれ以上に進歩的なポストプロセス・エッジスムージング技術が開発された。例を挙げれば[1] 、[2] 、[3] 、 [4] 、ポストMSAA  がある。他のポピュラーな技術にテンポラル・アンチエイリアシングがあり、Halo:Reachで使われた。DirectX 10ではシェーダーがマルチサンプル・レンダーターゲットにおいて個々のサンプルにアクセスできる機能が提供され、ハードウェアアンチエイリアスを遅延シェーディングで行なうことを可能にした。これらの機能はHDR輝度マッピングをアンチエイリアス済みのエッジに正確に適用することも可能にする。

3. 遅延ライティング
-----------

遅延ライティング  は遅延シェーディングを改変したものである。この技術は遅延シェーディングの2つのパスではなく3つのパスを用いる。シーンのジオメトリに関する第1パスではピクセルごとのライティングに必要な属性すなわち放射照度のみをGバッファに書き込む。"遅延"パスはGバッファを参照しながらスクリーンスペース上でその時拡散反射および鏡面反射の光源データのみを出力する。最終パスでは遅延パスで生成した光源データを参照しながらシーンを再度レンダリングし、最終的なピクセルごとのシェーディング結果を出力する。遅延ライティングの明確なメリットはGバッファのサイズの劇的な削減にある。一方、明らかな追加コストは、シーンのジオメトリを1度ではなく2度レンダリングすることが必要ということである。遅延シェーディングにおける遅延パスは1つの組み合わさった放射輝度の値を出力するだけでよいが、追加のコストとして遅延ライティングにおける遅延パスは拡散反射・鏡面反射の放射照度を別々に出力しなければならない。

Gバッファのサイズの削減により、この技術は部分的にではあるが遅延シェーディングの深刻な欠点である、複数マテリアルの問題を克服することができる。また、解決できるもう1つの問題はMSAAである。遅延ライティングはDirectX 9世代のハードウェアでもMSAAと一緒に使うことができる。

4. 商業ゲームで使われた遅延ライティング
---------------------

この技術は大量の動的な照明の使用や必要なシェーダー命令の複雑さの削減に関してコントロールできるため、コンピュータゲームでその使用が増加している。以下に遅延ライティングを用いているゲームの例をいくつか挙げる。

ALAN WAKE
BioShock Infinite
Blur
Brink
ライオットアクトおよびライオットアクト 2
Crysis 2
DEAD SPACE およびDead Space 2
:en:Deus Ex: Human Revolution
Grand Theft Auto IV
Halo:Reach
INFAMOUS〜悪名高き男〜およびInFAMOUS 2
LittleBigPlanetおよびLittleBigPlanet 2
シフト2 アンリーシュド
S.T.A.L.K.E.R. SHADOW OF CHERNOBYL、Clear SkyおよびCall of Prypiat
レッド・デッド・リデンプション
RESISTANCEシリーズ
スタークラフト2
アンチャーテッドおよびアンチャーテッド2
VANQUISH
アサシン クリード III

5. 商業ゲームで使われた遅延シェーディング
----------------------

遅延ライティングとは対照的に、この技術は多量のメモリや帯域を要求するためあまり人気はない。特にコンソールでは、メモリや帯域幅は強く限定され、しばしばボトルネックとなる。

Amnesia: The Dark Descent
バトルフィールド3
Dungeons
KILLZONE 2およびKILLZONE 3
Mafia 2
Metro 2033
Rift
:en:Rochard
シュレック
スプリンターセルコンビクション
Tabula Rasa
Trine
:en:Trine 2
あつまれ!ピニャータ
:en:Dota 2

6. ゲームエンジンにおける遅延技術
------------------

CryENGINE 3
I-Novae
Unity
Frostbite 2
Unreal Engine 3
:en:Chrome Engine
GameStart
Source Engine

7. 略歴
-----

遅延シェーディングの考えは遡ると:en:Michael Deeringとその同僚が1988年に書いた、//"The triangle processor and normal vector shader: a VLSI system for high performance graphics"//という題名の論文 で広められた。しかし、この論文では"Deferred"という単語は全く使われておらず、主要な発想は「各ピクセルがデプスレゾリューションの後に一度だけシェーディングされる」というものだった。我々が今日知っているような、Gバッファを使う遅延シェーディングは1990年の旧NTTヒューマンインタフェース研究所の斎藤隆文と高橋時市郎による論文で世に出されたが、彼らも「遅延」という単語を使ってはいなかった。 2004年前後に遅延シェーディングに適したグラフィックスハードウェアの実現が見え始めた。 その後この技術はコンピュータゲームのようなアプリケーション用に人気が出て、最終的に2008年から2010年あたりに主流となった。

8. 脚注
-----

9. 関連項目
-------

S.T.A.L.K.E.R. SHADOW OF CHERNOBYL他シリーズ
ロックスター・アドバンスド・ゲーム・エンジン
Unity