Anatomy of a Programmable Realtime Shader(プログラム可能なリアルタイム シェーダについて)

 
 
 

プログラム可能なリアルタイム シェーダにより、固定機能パイプラインを独自のプログラムに置き換えて、頂点レベルやピクセル レベルでシェーディングをコントロールすることができます。これで、さらに複雑なエフェクトを作成できますが、固定機能パイプラインが自動的に実行するコード(頂点の変換やシェーディング、テクスチャ座標の生成や変換、テクスチャ変調モードなど)を実装し直す必要があります。

プログラム可能なリアルタイム シェーダは、頂点シェーダとピクセル シェーダから構成されています。データ ストリームはアプリケーションから頂点シェーダへと流れ、続けてピクセル シェーダへ、最後にフレーム バッファヘと移動します。

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);
}