遅延シェーディング(Deferred Shading)とは
遅延
シェーディングは、3Dグラフィックスのレンダリング手法の一つで、画面空間(スクリーンスペース)上で
シェーディング(陰影計算)を行う技術です。従来のフォワード
シェーディングとは異なり、
シェーディング処理を後回しにする点が大きな特徴です。
処理の流れ
遅延
シェーディングは、主に以下の2つのパスで処理を行います。
1.
第1パス(ジオメトリパス): 頂点
シェーダーからピクセル
シェーダーまでの処理を行い、
シェーディングに必要な情報を収集します。この段階では、実際に
シェーディングは行われず、各表面の位置、法線、マテリアルなどの情報がジオメトリバッファ(G-Buffer)と呼ばれるテクスチャに格納されます。
2.
第2パス(シェーディングパス): G-Bufferに保存された情報を基に、ピクセルごとに直接照明や間接照明の計算を行います。
光源の数に依存しない処理: フォワードシェーディングでは、光源の数が増えるにつれて処理負荷が増大しますが、遅延シェーディングでは、光源の数に関わらず1回のジオメトリパスで処理が完了します。これにより、多数の光源が存在する複雑なシーンでも、パフォーマンスを維持できます。
リソース管理の柔軟性: 光源の形状、色、数などの特性を容易に制御でき、複雑なライティング環境におけるリソース管理が容易になります。
ソフトウェアレンダリングパイプラインの単純化: CPUとGPU両方において、レンダリングパイプラインを単純化できます。
透明度の処理: 透明なオブジェクトの描画が難しいという課題があります。
Zバッファを使用する一般的なシーンでは、透明なオブジェクトの描画は、深度ソートを行うことで解決されることが多いですが、遅延
シェーディングでは、この処理との相性が悪いです。
複数マテリアルの使用: 複数の異なるマテリアルを使用する場合、G-Bufferに保存するデータ量が増加し、メモリ帯域を圧迫します。これにより、パフォーマンスが低下する可能性があります。
アンチエイリアスの適用: ハードウェアアンチエイリアスを適用した場合、位置、法線、接線などの属性がサブピクセルで補間されるため、結果が不正確になる可能性があります。この問題を解決するために、ポストエフェクトとしてエッジ検出を行い、エッジをぼかす手法が用いられます。
遅延ライティング
遅延ライティングは、遅延
シェーディングを改良した手法で、3つのパスを使用します。
1.
第1パス: ジオメトリ情報をG-Bufferに格納し、ピクセルごとの
放射照度(irradiance)を記録します。
2.
第2パス: G-Bufferを参照し、スクリーンスペース上で拡散反射と鏡面反射の光源データを計算します。
3.
第3パス: 第2パスで生成された光源データを基に、シーンを再度レンダリングし、最終的な
シェーディング結果を出力します。
遅延ライティングのメリットは、G-Bufferのサイズを大幅に削減できる点です。これにより、複数マテリアル問題やMSAAの適用を改善できます。一方、デメリットとしては、シーンのジオメトリを2度レンダリングする必要がある点です。
商業ゲームでの利用例
遅延ライティングの利用例
ALAN WAKE
BioShock Infinite
Crysis 2
Grand Theft Auto IV
Halo:Reach
Amnesia: The Dark Descent
バトルフィールド3
KILLZONE 2、KILLZONE 3
Metro 2033
Dota 2
遅延技術を採用しているゲームエンジン
CryENGINE 3
Unity
* Unreal Engine 3
歴史
遅延
シェーディングの概念は、1988年の論文で発表されました。しかし、「遅延」という言葉は使われず、各ピクセルをデプス解像度後に1度だけ
シェーディングするという考え方が示されました。G-Bufferを使った現在の形に近い遅延
シェーディングは、1990年に発表されましたが、この論文でも「遅延」という言葉は使われていませんでした。
2004年頃から、遅延
シェーディングに適したグラフィックスハードウェアが登場し始め、
コンピュータゲームなどのアプリケーションで広く使われるようになりました。
まとめ
遅延
シェーディングと遅延ライティングは、3Dグラフィックスのレンダリングにおいて、より高度な表現を可能にする重要な技術です。これらの技術は、現代のゲーム開発において欠かせないものとなっています。それぞれのメリットとデメリットを理解し、適切な手法を選択することが重要です。