プログラム可能なリアルタイム シェーダにより、固定機能パイプラインを独自のプログラムに置き換えて、頂点レベルやピクセル レベルでシェーディングをコントロールすることができます。これで、さらに複雑なエフェクトを作成できますが、固定機能パイプラインが自動的に実行するコード(頂点の変換やシェーディング、テクスチャ座標の生成や変換、テクスチャ変調モードなど)を実装し直す必要があります。
プログラム可能なリアルタイム シェーダは、頂点シェーダとピクセル シェーダから構成されています。データ ストリームはアプリケーションから頂点シェーダへと流れ、続けてピクセル シェーダへ、最後にフレーム バッファヘと移動します。
OpenGL ベースのエフェクトをサポートする頂点およびピクセル シェーダのコードを作成するには、nVidia の Cg 言語または OpenGL Shading Language(GLSL)を使用します。DirectX9 ベースのエフェクトについては、Microsoft 上位レベル シェーディング言語(HLSL)を使用します。
ピクセル シェーダ([フラグメント](fragment) シェーダとも呼ぶ)は、オブジェクトの生成されたすべてのピクセルに対して実行されます。ピクセル シェーダは、入力パラメータを受け取って処理し、GPU のブレンディング コアに送る出力データを生成してから、フレーム バッファに書き込みます。入力パラメータは、頂点シェーダから取得され、所属する三角形の内部で補間されます。
リアルタイム シェーダの構造は非常にシンプルです。入力パラメータ、出力パラメータ、およびコードで構成されています。コードは、すべてのピクセルのすべての頂点に対して呼び出されます。
入力パラメータには、[uniform] と [varying] の 2 種類があります。uniform は、すべての頂点またはピクセルでパラメータ値が同じであることを意味します。varying は、すべての頂点とピクセルでパラメータ値が変わることを意味します。
たとえば、以下のシンプルな HLSL プログラムは、モデルビュー マトリクスによって頂点の位置を視線座標空間の位置に変換します。
struct a2v { float4 Position : POSITION; }; struct v2p { float4 Position : POSITION; }; void main(in a2v IN, out v2p OUT, uniform float4x4 ModelViewMatrix) { OUT.Position = mul(IN.Position, ModelViewMatrix); }