HDAO10.1 サンプル

Ee416412.d3d10_sample_HDAO10_1(ja-jp,VS.85).jpg

パス

ソース SDK ルート\Samples\C++\Direct3D10\HDAO10.1
実行可能ファイル SDK ルート\Samples\C++\Direct3D10\Bin\x86 または x64\HDAO10.1.exe

サンプルの概要

このサンプルは AMD から提供されたもので、高解像度アンビエント オクルージョン (HDAO) を得るための革新的なテクニックを示しています。このサンプルでは、Direct3D 10.1 の API とハードウェアで、新しいシェーダー モデル 4.1 の gather4 命令を利用することにより、このテクニックのパフォーマンスを大幅に向上します。

バレー検出

HDAO が実際にどのように機能するかを説明します。大半の SSAO アルゴリズムと比べて、HDAO は非常にシンプルです。基本的には深度のバレーを検出します。

主に HDAO は、入力として単一のサンプル深度バッファーのみが必要となる 1 つの全画面パスを実行します。ピクセル シェーダーは、対象となるピクセル周辺で多くの深度テクセルを一様にサンプリングします。実際には、特別な関係を持つ深度テクセルのペアを収集します。その後、これらのテクセルは対象ピクセルでミラー化されます。

シェーダーは、深度サンプルの各ペアに対してそれぞれのカメラ空間の Z 値を計算します。両方の Z 値が対象ピクセルよりもカメラに近ければ、シェーダーは Z のバレーを検出したと言えます。検出されたバレーの数が多いほど、そのピクセルのオクルージョン係数は大きくなります。

深度サンプルの数が多くなればそれだけ品質の高い結果が得られますが、その技法はまさにハイエンド エフェクトになります。HDAO は他の SSAO 技法とは異なり、高周波のディテールをキャプチャーします。そのため、この技法を使用する開発者の数がますます増えています。

またサンプルでは、アプリケーションでカメラ空間の法線が利用可能な場合、それらを使用してさまざまな法線マップを持つサーフェスにアンビエント オクルージョンを生成できることを示しています。これはオプションであり、多くの遅延レンダリング エンジンに適しています。

MSAA 深度バッファーの処理

前述のとおり、この技法では単一のサンプル深度バッファーのみが必要となります。ここでは、MSAA 深度バッファーがある場合の、一般的なケースの適切な処理方法を説明します。

ほとんどのゲーム エンジンでは、ポストプロセッシング エフェクトに単一のサンプル深度を使用しています。また、単一のサンプル深度バッファーを生成するために、通常、次の 3 つの方法のうちいずれかまたは複数の方法を実行しています。

  1. 単一のサンプル深度を R32 カラー バッファーに書き込む深度専用パスを実行します。余分なパス全体がエンジンに追加されるため、必然的に負荷は高くなります。
  2. 深度を、メイン レンダリング パスの一部としてセカンダリ レンダー ターゲットに書き込みます。複数のレンダー ターゲットのセットアップでは、常にパフォーマンス コストが増加します。
  3. MSAA 深度バッファーのカスタム シェーダー解決を実行します。これは、Direct3D 10.1 でのみ実行可能です。この方法を選択した場合、方法 1 および 2 を実行する必要はなくなります。そのため、パフォーマンスが大幅に向上する可能性があります。

シェーダー定数

GUI では、エフェクトを特定のスタイルに調整するために使用できるいくつかのシェーダー定数を提供しています。

  • [無効範囲](Reject Radius): サンプリングしたカメラ Z 値のペアのいずれかが、[無効範囲](Reject Radius) よりも中心ピクセルのカメラ Z 値から遠い場合、そのサンプルのペアは、オクルージョン係数に使用されません。これにより、遠くのオブジェクトによって近くのオブジェクトのシルエット エッジにオクルージョンのにじみが生じてしまうという、SSAO でよく起きる問題が回避されます。
  • [有効範囲](Accept Radius): この機能は、[無効範囲](Reject Radius) と似ています。ここでも、ペアのいずれかが [有効範囲](Accept Radius) よりも中心サンプルに近い場合、そのサンプルのペアはオクルージョン係数に使用されません。これは、特に低密度のメッシュに対する不要なオクルージョンを避けるために有用です。
  • [インテンシティ](Intensity): これは、単に最終的なオクルージョン係数をスケーリングするための値です。

低密度のメッシュ

HDAO は、低密度のメッシュに対しても不要なオクルージョンを適用する場合があります。これは、必要な結果を得るための [有効範囲](Accept Radius)[無効範囲](Reject Radius) のパラメーターが設定されていない場合に起こります。サンプルでは、砂漠に横たわる戦車のシーンの低密度地形メッシュでこの問題が確認できます。このため、メッシュによっては HDAO の対象から外す必要があります。

このサンプルでは、ステンシル バッファーを使用してこれを実行するためのメソッドを実装しています。ただし利用可能であれば、別の全画面サーフェスのアルファ チャンネルを使用する方が効率的な場合があります。

パフォーマンス

HDAO は負荷の高いエフェクトであり、特にテクスチャリングの負荷は非常に高くなります。この負荷を軽減するために、サンプリングを高速化する Direct3D 10.1 gather4 命令が使用されています。これにより、1 度に 1 つではなく 4 つのサンプルを読み取ることができます。その結果、このテクニックのテクスチャリング オーバーヘッドが大幅に削減されます。また、1 度に 4 つのサンプルを処理するもう 1 つの利点は、演算がとても自然にベクトル化される点です。