ピクセル シェーダー ステージ

ピクセル シェーダー ステージ (PS) を使用すると、ピクセル単位の照明や後処理などの豊富なシェーディング手法が可能になります。 ピクセル シェーダーは、定数変数、テクスチャ データ、補間された頂点単位の値などのデータを組み合わせて、ピクセル単位の出力を生成するプログラムです。 ラスタライザー ステージは、プリミティブでカバーされるピクセルごとにピクセル シェーダーを 1 回呼び出しますが、シェーダーの実行を回避するために NULL シェーダーを指定できます。

ピクセル シェーダー

テクスチャをマルチサンプリングする場合、カバーされたピクセルごとにピクセル シェーダーが 1 回呼び出され、カバーされた各マルチサンプルについて深度/ステンシル テストが発生します。 深度/ステンシル テストを通過したサンプルは、ピクセル シェーダーの出力色で更新されます。

ピクセル シェーダーの組み込み関数は、画面領域 x および y についての数量の微分係数を生成したり、使用したりします。 微分係数の最も一般的な用途は、テクスチャ サンプリングの詳細レベルの計算や、異方性フィルタリングにおいて、異方性の軸に沿ったサンプルを選択するための計算などです。 通常、ハードウェアの実装では、複数のピクセル (たとえば 2x2 グリッド) に対して同時にピクセル シェーダーが実行されます。そのため、ピクセル シェーダーで計算された数量の微分係数を、隣接ピクセルの同じ実行時点における値の差分として合理的に近似させることができます。

入力

パイプラインがジオメトリ シェーダーなしに構成されている場合、ピクセル シェーダーは 16 個の 32 ビット、4 成分の入力に制限されます。 それ以外の場合、ピクセル シェーダーは 32 ビット、4 成分の入力を 32 個まで受け取ることができます。

ピクセル シェーダーの入力データには (パースペクティブ補正あり/なしで補間可能な) 頂点属性が含まれます。または、ピクセル シェーダーの入力データをプリミティブ単位の定数として処理することもできます。 ピクセル シェーダー入力は、宣言された補間モードに基づき、ラスター化されているプリミティブの頂点属性から補間されます。 プリミティブがラスター化前にクリップされた場合は、クリッピング処理中に補間モードが受け入れられます。

頂点属性は、ピクセル シェーダーの中心位置で補間 (または評価) されます。 ピクセル シェーダーの属性補間モードは、入力レジスタ宣言において、引数または入力構造体の要素単位で宣言します。 属性は、線形的に補間することも、 重心サンプリングを使用して補間することもできます。 重心評価はマルチサンプリング時のみに関連し、ピクセルがプリミティブによってカバーされているが、ピクセルの重心はカバーされていない場合に対応するためのものです。重心評価は、(カバーされていない) ピクセルの重心のできるだけ近くで行われます。

入力はシステム値セマンティクスで宣言することもできます。システム値セマンティクスは、他のパイプライン ステージで使用されるパラメーターをマークします。 たとえば、ピクセルの位置は、SV_Position セマンティクスでマークします。 IA ステージでは、(SV_PrimitiveID を使用して) ピクセル シェーダーに対して 1 つのスカラーを生成できます。ラスタライザー ステージでは、(SV_IsFrontFaceを使用して) ピクセル シェーダーに対して 1 つのスカラーを生成することもできます。

出力

ピクセル シェーダーは、32 ビット、4 成分の色を 8 つまで出力できます。ピクセルが破棄された場合は色を出力することはできません。 ピクセル シェーダーの出力レジスタの成分は、使用前に宣言する必要があります。レジスタごとに異なる出力書き込みマスクを使用できます。

深度データを深度バッファーに書き込むかどうかを制御するには、深度書き込み可能状態 (出力結合ステージ) を使用します (または、破棄命令を使用してそのピクセルのデータを破棄します)。 ピクセル シェーダーは、深度テスト用にオプションで 32 ビット、1 成分、浮動小数点の深度値を出力することもできます (SV_Depth セマンティクスを使用します)。 深度値は、oDepth レジスタに出力され、深度テスト用の補間された深度値と置き換えられます (深度テストが有効化されていると想定しています)。 固定関数深度またはシェーダー oDepth の使用を動的に変更することはできません。

ピクセル シェーダーはステンシル値を出力できません。

グラフィックス パイプライン

パイプライン ステージ (Direct3D 10)