出力深度レジスタ
ピクセル シェーダーの出力深度レジスタ (oDepth) は、深度/ステンシル バッファーに対する深度テストに必要な新しい深度値を返す、書き込み専用のスカラー レジスタです。
構文
oDepth |
---|
この場合
名前 | 説明 |
---|---|
oDepth | 深度ステンシル バッファーに対する深度テスト用の新しい深度値です。 |
解説
oDepth に書き込みを行うと、深度テストのパフォーマンスを加速化するハードウェア固有の深度バッファー最適化アルゴリズム (つまり、階層的 Z) の効果が失われる点に注意する必要があります。
oDepth に対して書き込みを行う場合は、複製元のスィズル (.x | .y | .z | .w) が必要です。明示的な書き込みマスクは許可されていません。
oDepth レジスタに書き込みを行うと、補間された深度値が置き換えられます (さらに、深度バイアスと勾配スケールのレンダーステートは無視されます)。深度バッファーが作成されていない場合、またはデバイスにアタッチされていない場合、oDepth に対する書き込みは無視されます。
マルチサンプリング中に oDepth に書き込みを行った場合、ピクセル シェーダーはピクセルごとに 1 回しか実行されないため、深度値はカバーされているすべてのサブサンプルの場所について複製されます。引き続き、深度テストはサンプル単位で実行されますが、oDepth に書き込みを行わなかった場合には存在する、ピクセル シェーダーから比較に渡されるサンプル単位の深度値は得られません。
深度バッファーとして設定された w バッファーを持つアプリケーションについては、oDepth への書き込み時に、この点を考慮する必要があります。このようなアプリケーションでは、oDepth に書き込まれた w 値をスケーリングするために、w 範囲の情報をピクセル シェーダーに送り、w 範囲を計算することが必要になる場合があります。
ps_2_0 と ps_2_x の制限事項
- oDepth は mov - ps 命令でのみ書き込み可能で、1 回しか実行できません。
- oDepth への書き込み時にソース修飾子は使用できません。
- oDepth への書き込み時に命令修飾子は使用できません。
- フロー制御コンストラクト内、またはプレディケーションの使用中は、oDepth への書き込みは行われません。
ps_3_0 の制限事項
- ps_3_0 の場合、出力レジスタ oC# と oD# には何度でも書き込みできます。ピクセル シェーダーの出力は、シェーダー実行の終了時に、出力レジスタの内容から取得されます。出力レジスタへの書き込みが行われない場合は、フロー制御が原因である可能性があります。また、シェーダーが書き込みを行わなかった場合は、対応するレンダー ターゲットも更新されません。出力レジスタ内のチャンネルのサブセットに書き込みを行うと、他のチャンネルに未定義の値が書き込まれます。
- すべての使用可能なパスが最終的にレジスタに書き込みを行っていれば、フロー制御またはプレディケーション内で oDepth への書き込みを実行できます。
- プリミティブ単位で分岐条件が変わるフロー制御ステートメント (つまり、動的フロー制御命令) 内では、グラデーション計算 (または、texld - ps_2_0 以上、texldb - ps、texldp - ps などのグラデーション計算を暗黙的に呼び出す演算) は実行できません。命令プレディケーションは動的フロー制御では考慮されません。