ピクセル シェーダー (PS) ステージ
ピクセル シェーダー (PS) ステージはプリミティブの補間データを受信し、カラーなどのピクセル単位のデータを生成します。
これはプログラム可能なシェーダー ステージであり、グラフィックス パイプライン図では角丸ブロックとして示されます。 このシェーダー ステージは、シェーダー モデル 4.0 の共通シェーダー コアに基づいて構築された、独自の機能を公開します。
ピクセル シェーダー ステージ (PS) では、ピクセル単位の照明や後処理など、豊富なシェーディング手法を使用できます。 ピクセル シェーダーは、定数変数、テクスチャ データ、補間された頂点単位の値などのデータを組み合わせて、ピクセル単位の出力を生成するプログラムです。 ラスタライザー (RS) ステージでは、プリミティブによってカバーされたピクセルごとにピクセル シェーダーが 1 回呼び出されます。ただし、NULL シェーダーを指定して、シェーダーを実行しないようにすることもできます。
テクスチャをマルチサンプリングする場合、カバーされたピクセルごとにピクセル シェーダーが 1 回呼び出され、カバーされた各マルチサンプルについて深度/ステンシル テストが発生します。 深度/ステンシル テストを通過したサンプルは、ピクセル シェーダーの出力色で更新されます。
ピクセル シェーダーの組み込み関数は、画面領域 x および y についての数量の微分係数を生成したり、使用したりします。 微分係数の最も一般的な用途は、テクスチャ サンプリングの詳細レベルの計算や、異方性フィルタリングにおいて、異方性の軸に沿ったサンプルを選択するための計算などです。 通常、ハードウェアの実装では、複数のピクセル (たとえば 2x2 グリッド) に対して同時にピクセル シェーダーが実行されます。そのため、ピクセル シェーダーで計算された数量の微分係数を、隣接ピクセルの同じ実行時点における値の差分として合理的に近似させることができます。
入力
パイプラインがジオメトリ シェーダーなしに構成されている場合、ピクセル シェーダーは 16 個の 32 ビット、4 成分の入力に制限されます。 それ以外の場合、ピクセル シェーダーは 32 ビット、4 成分の入力を 32 個まで受け取ることができます。
ピクセル シェーダーの入力データには (パースペクティブ補正あり/なしで補間可能な) 頂点属性が含まれます。または、ピクセル シェーダーの入力データをプリミティブ単位の定数として処理することもできます。 ピクセル シェーダー入力は、宣言された補間モードに基づき、ラスター化されているプリミティブの頂点属性から補間されます。 プリミティブがラスター化前にクリップされた場合は、クリッピング処理中に補間モードが受け入れられます。
頂点属性は、ピクセル シェーダーの中心位置で補間 (または評価) されます。 ピクセル シェーダーの属性補間モードは、入力レジスタ宣言において、引数または入力構造体の要素単位で宣言します。 属性は、線形補間することも、重心サンプリングによって補間することもできます。 「ラスター化ルール」の「マルチサンプル アンチエイリアシング時の属性の重心サンプリング」セクションをご覧ください。 重心評価はマルチサンプリング時のみに関連し、ピクセルがプリミティブによってカバーされているが、ピクセルの重心はカバーされていない場合に対応するためのものです。重心評価は、(カバーされていない) ピクセルの重心のできるだけ近くで行われます。
入力はシステム値セマンティクスで宣言することもできます。システム値セマンティクスは、他のパイプライン ステージで使用されるパラメーターをマークします。 たとえば、ピクセルの位置は、SV_Position セマンティクスでマークします。 入力アセンブラー (IA) ステージで、(SV_PrimitiveID を使用して) ピクセル シェーダーのスカラーを 1 つ生成できます。また、ラスタライザー (RS) ステージでも、(SV_IsFrontFace を使用して) ピクセル シェーダーのスカラーを 1 つ生成することができます。
出力
ピクセル シェーダーは、32 ビット、4 成分の色を 8 つまで出力できます。ピクセルが破棄された場合は色を出力することはできません。 ピクセル シェーダーの出力レジスタの成分は、使用前に宣言する必要があります。レジスタごとに異なる出力書き込みマスクを使用できます。
深度バッファーに深度データを書き込むかどうかは、(出力結合 (OM) ステージで) 深度書き込みの有効化ステートを使用して制御します (または、破棄命令を使用して、そのピクセルのデータを破棄します)。 ピクセル シェーダーは、深度テスト用にオプションで 32 ビット、1 成分、浮動小数点の深度値を出力することもできます (SV_Depth セマンティクスを使用します)。 深度値は、oDepth レジスタに出力され、深度テスト用の補間された深度値と置き換えられます (深度テストが有効化されていると想定しています)。 固定関数深度またはシェーダー oDepth の使用を動的に変更することはできません。
ピクセル シェーダーはステンシル値を出力できません。
関連トピック