ディファードレンダリング
[Wikipedia|▼Menu]
拡散色GバッファZバッファ法線Gバッファ最終的な合成結果

遅延シェーディング (ちえんシェーディング、: Deferred Shading、ディファードシェーディング、遅延レンダリングとも) は2次元のスクリーンスペース(画面空間)上でシェーディング(陰影計算)を行なう技術である。遅延と呼ばれるのは最初にジオメトリを処理する頂点シェーダーからピクセルシェーダーに至るまでの第1パスでシェーディングが実際に実行されていないからである。かわりにシェーディングは第1パスの結果を使ってレンダリングされる第2パスまで「遅延」される。

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

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

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

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

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

さらにもう1つの深刻なデメリットがある。それはライティングの段階とジオメトリの段階を切り離しているため、ハードウェアアンチエイリアスは一定以上正確な結果を出せないことである。補間されたサブピクセルでは、位置、法線、および接線といった属性は無意味になる。この制限を乗り越えるための通常技術の1つとして、最終画像でポストエフェクトとしてエッジ検出を行ない、エッジをぼかすというものがある[6]。しかし、近年[いつ?]ではそれ以上に進歩的なポストプロセス・エッジスムージング技術が開発された。例を挙げれば ⇒MLAA[7] (中でもKILLZONE 3やen:Dragon Age 2に使われた)、 ⇒FXAA[8] (Crysis 2F.E.A.R. 3Duke Nukem Foreverで用いられた)、 ⇒SRAA [9]、 ⇒DLAA[10] (en:Star Wars: The Force Unleashed IIで用いられた)、ポストMSAA (Crysis 2でデフォルトのアンチエイリアス法として使われた) がある。他のポピュラーな技術にテンポラル・アンチエイリアシングがあり、Halo:Reachで使われた[11]。DirectX 10ではシェーダーがマルチサンプル・レンダーターゲットにおいて個々のサンプルにアクセスできる機能が提供され、ハードウェアアンチエイリアスを遅延シェーディングで行なうことを可能にした(DirectX 10.1ではデプスバッファにもアクセス可能[12])。これらの機能はHDR輝度マッピングをアンチエイリアス済みのエッジに正確に適用することも可能にする(なお、これは前バージョンのAPIでは、アンチエイリアスのすべての利益が失われるかもしれない状況である)。
遅延ライティング

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

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

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

ALAN WAKE

BioShock Infinite[14]

Blur

Brink

ライオットアクトおよびライオットアクト 2[15]

Crysis 2[16]

DEAD SPACE[17] およびDead Space 2[18]

en:Deus Ex: Human Revolution [19]

Grand Theft Auto IV

Halo:Reach [20]

INFAMOUS?悪名高き男?およびInFAMOUS 2[14]

LittleBigPlanetおよびLittleBigPlanet 2[21]

シフト2 アンリーシュド [22]


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:46 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef