出力カラー レジスタ
ピクセル シェーダーのカラー出力レジスタ (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 - ps、texldp - ps などのグラデーション計算を暗黙的に呼び出す演算) は実行できません。命令プレディケーションは動的フロー制御では考慮されません。