深度テストに関する限り、DirectX は深度テストがピクセル シェーダーの後に行われるように見える必要があると述べていますが、実際にそうしなければならないとは述べていません。実際には、初期の z は、多くのメーカーのハードウェアに長年にわたって存在しています。多くの場合、初期 Z のコストを回避するために、個々のピクセルではなく、一度に多くのピクセルの「タイル」で動作する Hierarchical Z と呼ばれる、初期よりもさらに早い形式の Z テストがあります。
初期の Z は、デバイスに設定した特定の状態でオンまたはオフにできるものではありません。ハードウェアは、できるだけ早く Z テストを実行し、ピクセル シェーダーの後以外の場所にあることがわからないようにします。
ただし、ハードウェアが z テストを実行する能力を制限する可能性がある特定のことがあります。ハードウェアが深度値を書き込むかどうかを決定する前にピクセル シェーダーを実行する必要があるため、アルファ テスト、「破棄」(ピクセルを殺す) の使用、およびカバレッジへのアルファはすべて確実に初期 z 書き込みを無効にします。アルファ テスト / 破棄を使用していて、z 書き込みが必要ない場合は、それらをオフにすると、初期 z が利用可能になる可能性が最も高くなります。
初期の Z が必要な場合は、ピクセル シェーダーで「深度」を変更/書き込むことは絶対にできません。この状況では、ハードウェアは初期のテストを実行することさえできません。ピクセル シェーダーで決定したため、初期の z テストも初期の z 書き込みも実行できません。
ピクセル シェーダーから深度を書き込む必要があるが、ラスタライザーが生成した値以上の深度値のみを書き込むことを保証できる場合は、文書化されていないSV_DepthGreater
出力セマンティックを使用できます。補間された深さよりも小さい深さの値を書き込まないことを約束しているため、ハードウェアは初期の z テストを試行して実行できますが、ピクセル シェーダーの最後まで z の書き込みを延期します。(SV_DepthLessEqual
たまたま逆 z-test/z-buffer を使用している場合は、同等のものがあります)。
z テストはパイプラインの最後で行われるように見える必要があるため、ピクセル シェーダーで UAV を使用すると、早期 z も無効になります。レンダー ターゲットが唯一の出力ではなくなり、DirectX 仕様では最終的に z テストが行われるように見える必要があると規定されているため、最終的に z テストに失敗するピクセルに対しても UAV 書き込みが行われる必要があります。このため、[earlydepthstencil]と呼ばれる属性が Shader Model 5 に追加されました。この属性は、UAV 書き込みが発生している場合でも、初期 z が発生しても (可能であれば) 喜んでピクセル シェーダーを実行しないことを DirectX に伝えます。
要約すると、上記の少し風変わりなこと (SV_DEPTH を使用して深度を変更する、カバレッジにアルファを使用する、クリップ/破棄を使用するなど) のいずれも行っていない場合は、初期 Z の利点を既に得ている可能性があります。z-write が必要ない場合は常にオフにし、SV_DEPTH への書き込みは避けてください。