次の方法で共有


出力カラー レジスタ

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

構文

oC#

この場合

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

解説 

  • oCn に書き込みを行っても、対応するレンダー ターゲットが存在しない場合、この oCn への書き込みは無視されます。
  • oCn のどの成分が最終的に (ブレンディングを行う場合は、ブレンディングの後で) レンダー ターゲットに書き込まれるかは、D3DRS_COLORWRITEENABLE、D3DRS_COLORWRITEENABLE1、D3DRS_COLORWRITEENABLE2、D3DRS_COLORWRITEENABLE3 の各レンダリング ステートによって決定されます。指定された oCn レジスタについて D3DRS_COLORWRITEENABLE* レンダリング ステートで定義されたすべての成分を書き込まず、その一部の成分だけをシェーダーが書き込む場合、対応するレンダー ターゲットには、書き込みを行わないチャンネルによって、未定義の値が生成されます。したがって、oCn のいずれの成分も書き込まれない場合は、対応するレンダー ターゲットは一切更新されず、D3DRS_COLORWRITEENABLE* レンダリング ステートは適用されません。

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

  • oCn は mov - ps 命令でのみ書き込みできます。
  • oC0 は常にシェーダーで書き込みを行う必要があります。
  • oCn への書き込み時は、ソース スィズル (デフォルト スィズルの .xyzw を除く) およびソース修飾子は一切使用できません。
  • oCn への書き込み時は、デスティネーション書き込みマスク (デフォルト マスクの .xyzw を除く) および命令修飾子は一切使用できません。
  • oCn に対して書き込みを行う場合、oC0 ~ oCn-1 に対しても書き込みを行う必要があります。たとえば、oC2 に書き込みを行う場合、oC0 および oC1 にも書き込みを実行する必要があります。
  • すべての oC# への書き込みは、シェーダーごとに 1 回だけ実行できます。
  • 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)