出力カラー レジスタ

ピクセル シェーダーカラー出力レジスタ (oC#) は、結果を複数のレンダー ターゲットに出力する書き込み専用レジスタです。

構文

Oc#

 

この場合、

名前 説明
oC0 レンダー ターゲット #0
oC1 レンダー ターゲット #1
oC2 レンダー ターゲット #2
oC3 レンダー ターゲット #3

 

注釈

  • oCn が書き込まれ、対応するレンダー ターゲットがない場合、oCn へのこの書き込みは無視されます。
  • レンダリング状態D3DRS_COLORWRITEENABLE、D3DRS_COLORWRITEENABLE1、D3DRS_COLORWRITEENABLE2、D3DRS_COLORWRITEENABLE3によって、最終的にレンダー ターゲットに書き込まれる oCn のコンポーネントが決定されます (該当する場合はブレンド後)。 シェーダーが特定の oCn レジスタに対してD3DRS_COLORWRITEENABLE* レンダリング状態で定義されているコンポーネントの一部を書き込むが、すべてではない場合、書き込まれていないチャネルは対応するレンダー ターゲットで未定義の値を生成します。 oCn のコンポーネントが書き込まれていない場合は、対応するレンダー ターゲットを (前述のように) まったく更新しないでください。そのため、D3DRS_COLORWRITEENABLE* レンダリング状態は適用されません。

シェーダー モデル 2 の制限事項

  • oCn は mov - ps 命令でのみ記述できます。
  • oC0 は常にシェーダーで記述する必要があります。
  • oCn への書き込み時に、ソース swizzle (.xyzw = 既定の swizzle を除く) またはソース修飾子は使用できません。
  • oCn への書き込み時に、宛先書き込みマスク (.xyzw = 既定のマスクを除く) または命令修飾子は使用できません。
  • oCn が書き込まれる場合は、oC0 - oCn-1 も書き込む必要があります。 たとえば、oC2 に書き込むには、oC0 と oC1 にも書き込む必要があります。
  • シェーダーごとに最大 1 つの oC# への書き込みが許可されます。
  • ps_2_xとps_3_0の場合、動的フロー制御または事前設定内で oC# および oD# レジスタに書き込むことはできません (静的フロー制御内の oC# への書き込みは問題ありません)。

シェーダー モデル 3 の制限事項

  • ps_3_0の場合、出力レジスタ oC# と oD# は何度でも書き込むことができます。 ピクセル シェーダーの出力は、シェーダーの実行の終了時に出力レジスタの内容から取得されます。 フロー制御が原因で出力レジスタへの書き込みが行われなかった場合、またはシェーダーが書き込まなかった場合は、対応するレンダーターゲットも更新されません。 出力レジスタ内のチャネルのサブセットが書き込まれると、未定義の値が残りのチャネルに書き込まれます。
  • ps_3_0の場合、oC# レジスタは任意の書き込みマスクで書き込むことができます。
  • ps_2_xとps_3_0の場合、動的フロー制御または事前設定内で oC# および oD# レジスタに書き込むことはできません (静的フロー制御内の oC# への書き込みは問題ありません)。
  • 分岐条件がプリミティブごとに異なるフロー制御ステートメント (動的フロー制御命令) 内で、勾配計算 (または texld - ps_2_0 以降texldb - pstexldp - ps などのグラデーション計算を暗黙的に呼び出す操作) を実行することはできません。 命令の割り込みは、動的フロー制御とは見なされません。

レジスタ

複数のレンダー ターゲット (Direct3D 9)