遅延シェーディング

遅延シェーディング (英: Deferred Shading、ディファードシェーディング、遅延レンダリングとも) は2次元のスクリーンスペース（画面空間）上でシェーディング（陰影計算）を行なう技術である。遅延と呼ばれるのは最初にジオメトリを処理する頂点シェーダーからピクセルシェーダーに至るまでの第1パスでシェーディングが実際に実行されていないからである。かわりにシェーディングは第1パスの結果を使ってレンダリングされる第2パスまで「遅延」される。 遅延シェーダーの第1パスでは、最終的なシェーディングに必要とされるデータがいったん収集されるのみとなる。各表面の位置や法線、マテリアルといった幾何学情報は、1組のテクスチャとしてジオメトリバッファ (英: Geometry Buffer, G-Buffer) にレンダリングされ、2次元情報として保存される。この後、ピクセルシェーダーは、スクリーンスペースにおいてテクスチャバッファの情報を使うピクセルごとに直接あるいは間接照明を演算する。 スクリーンスペース・ディレクショナルオクルージョンは直接影や反射を与えるという目的で遅延シェーディングのパイプラインの一部にすることができる。 遅延シェーディングの主なメリットとしては、シーンのジオメトリとライティングの分離が挙げられる。遅延シェーディングの対義語として、従来のレンダリング手順は前方シェーディング (英: Forward Shading、フォワードシェーディング、前方レンダリングとも) と呼ばれることがあるが、前方シェーディングでは光源の数に応じてジオメトリパスを走らせる必要があり、光源の数に比例してパフォーマンスが低下していく。一方、遅延シェーディングにおいては、光源の数がいくら増えようとも、1つのジオメトリパスのみが要求され、各光源は実際に影響するピクセルに対してのみ計算される。これは深刻なパフォーマンスへの影響なしに、シーンに多くの光源を配置できるということである。この手法ではほかにもいくつかのメリットが論じられている。メリットには、複雑なライティングにおけるリソース管理の容易化・柔軟化（光源の形状、光の波長すなわち色、および光源の数などの特性の制御）、およびCPU・GPU双方におけるソフトウェアレンダリングパイプラインの単純化も含まれうる。 遅延レンダリングの重要なデメリットとして、アルゴリズムで透明度 (英: transparency) を制御できないことが挙げられる。この問題はZバッファを使ったシーンでは一般的な問題ではあるが、シーンの透明部分のレンダリングを最後まで遅らせ、さらに深度ソートすることによって制御・解決されることが多いため、遅延レンダリングとの相性が悪い。 深度剥離法 (en:Depth peeling) を用いれば、遅延レンダリングにおける順序非依存の透明度 (en:Order-independent transparency, OIT) を実現することができるが、追加バッチとGバッファのコストを犠牲にせざるを得ない。DirectX 10以降をサポートしているハードウェアでは大体バッチを実行してもリアルタイムのフレームレートを十分な速さで維持できる[要出典]。OITが強く要求される場合においては、遅延シェーディングはそれでもなお同様の技術を用いた前方シェーディングよりも効果的である。 もう1つの深刻なデメリットとして、複数のマテリアルを使うのが困難だということが挙げられる。遅延シェーディングにおいて多数の異なるマテリアルを使うこと自体は可能だが、Gバッファに保存するためにはさらなるデータ領域が要求され、メモリ帯域を消費することになる。 さらにもう1つの深刻なデメリットがある。それはライティングの段階とジオメトリの段階を切り離しているため、ハードウェアアンチエイリアスは一定以上正確な結果を出せないことである。補間されたサブピクセルでは、位置、法線、および接線といった属性は無意味になる。この制限を乗り越えるための通常技術の1つとして、最終画像でポストエフェクトとしてエッジ検出を行ない、エッジをぼかすというものがある。 しかし、近年[いつ?]ではそれ以上に進歩的なポストプロセス・エッジスムージング技術が開発された。例を挙げればMLAA (中でもKILLZONE 3やen:Dragon Age 2に使われた)、FXAA (Crysis 2やF.E.A.R. 3、Duke Nukem Foreverで用いられた)、SRAA 、 DLAA (en:Star Wars: The Force Unleashed IIで用いられた)、ポストMSAA (Crysis 2でデフォルトのアンチエイリアス法として使われた) がある。他のポピュラーな技術にテンポラル・アンチエイリアシングがあり、Halo:Reachで使われた。DirectX 10ではシェーダーがマルチサンプル・レンダーターゲットにおいて個々のサンプルにアクセスできる機能が提供され、ハードウェアアンチエイリアスを遅延シェーディングで行なうことを可能にした（DirectX 10.1ではデプスバッファにもアクセス可能）。これらの機能はHDR輝度マッピングをアンチエイリアス済みのエッジに正確に適用することも可能にする（なお、これは前バージョンのAPIでは、アンチエイリアスのすべての利益が失われるかもしれない状況である）。 遅延ライティング (英: Light Pre-Pass、ライトプリパスとも) は遅延シェーディングを改変したものである。この技術は遅延シェーディングの2つのパスではなく3つのパスを用いる。シーンのジオメトリに関する第1パスではピクセルごとのライティングに必要な属性すなわち放射照度（英: irradiance、イラディアンス）のみをGバッファに書き込む。"遅延"パスはGバッファを参照しながらスクリーンスペース上でその時拡散反射および鏡面反射の光源データのみを出力する。最終パスでは遅延パスで生成した光源データを参照しながらシーンを再度レンダリングし、最終的なピクセルごとのシェーディング結果を出力する。遅延ライティングの明確なメリットはGバッファのサイズの劇的な削減にある。一方、明らかな追加コストは、シーンのジオメトリを1度ではなく2度レンダリングすることが必要ということである。遅延シェーディングにおける遅延パスは1つの組み合わさった放射輝度（英: radiance、ラディアンス）の値を出力するだけでよいが、追加のコストとして遅延ライティングにおける遅延パスは拡散反射・鏡面反射の放射照度を別々に出力しなければならない。 Gバッファのサイズの削減により、この技術は部分的にではあるが遅延シェーディングの深刻な欠点である、複数マテリアルの問題を克服することができる。また、解決できるもう1つの問題はMSAAである。遅延ライティングはDirectX 9世代のハードウェアでもMSAAと一緒に使うことができる。 この技術は大量の動的な照明の使用や必要なシェーダー命令の複雑さの削減に関してコントロールできるため、コンピュータゲームでその使用が増加している。以下に遅延ライティングを用いているゲームの例をいくつか挙げる。 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 遅延ライティングとは対照的に、この技術は多量のメモリや帯域を要求するためあまり人気はない。特にコンソールでは、メモリや帯域幅は強く限定され、しばしばボトルネックとなる。 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 CryENGINE 3 I-Novae Unity Frostbite 2 Unreal Engine 3 en:Chrome Engine GameStart Source Engine 遅延シェーディングの考えは遡るとen:Michael Deeringとその同僚が1988年に書いた、"The triangle processor and normal vector shader: a VLSI system for high performance graphics"（「三角形のプロセッサと法線ベクトルシェーダー: ハイパフォーマンスグラフィックスのためのVLSIシステム」）という題名の論文 で広められた。しかし、この論文では"Deferred"という単語は全く使われておらず、主要な発想は「各ピクセルがデプスレゾリューションの後に一度だけシェーディングされる」というものだった。我々が今日知っているような、Gバッファを使う遅延シェーディングは1990年の旧NTTヒューマンインタフェース研究所の斎藤隆文と高橋時市郎による論文で世に出されたが、彼らも「遅延」という単語を使ってはいなかった。 2004年前後に遅延シェーディングに適したグラフィックスハードウェアの実現が見え始めた。 その後この技術はコンピュータゲームのようなアプリケーション用に人気が出て、最終的に2008年から2010年あたりに主流となった。