エフェクトファイルの構成
エフェクトファイルの典型的な構成は、以下のようになっています。
パラメータ定義
シェーダコードから参照する各種パラメータ(グローバル変数)を定義します。これらには、第2回で紹介したような、ユーザが値を直接指定するパラメータの他、MMEによって自動的に値が設定されるパラメータが存在します。
シェーダコード
3Dオブジェクトの描画の仕方を記述した、GPU用のプログラムコードをここで記述します。
シェーダは、「頂点シェーダ」と「ピクセルシェーダ」の2種類1組からなります。これらの役割の違いを、強引に現実の絵画に例えるならば、
- 頂点シェーダ: 物体をキャンパス上に配置する位置・構図を決める
- ピクセルシェーダ: 物体を塗る色を決める
に対応します。
頂点シェーダ
頂点シェーダでは、オブジェクトの各頂点のスクリーン上の座標を計算します。また、色計算に必要な頂点情報をピクセルシェーダに渡すことも行います。
ピクセルシェーダ
ピクセルシェーダでは、スクリーン上に展開されたオブジェクトの、各ピクセルの色を計算します。
テクニック定義
描画に使用する、頂点シェーダ・ピクセルシェーダの組み合わせを指定します(補足1)。
頂点シェーダとピクセルシェーダの組み合わせを定義したものをパスと呼びます。1つのパスは、1回のレンダリング処理に対応します。1つ以上のパスをグループ化したものをテクニックと呼びます。
描画対象の種類(オブジェクト本体・影・輪郭)や材質等によって、描画に使用するシェーダを切り替えるには、複数のテクニックを定義します。
シェーダ周りのデータの流れを簡単に表すと、以下のようになります。
頂点シェーダは頂点単位で実行され、入力はオブジェクトの頂点情報(ボーン・モーフによる変形処理後のもの)、出力は頂点のスクリーン上の座標+ピクセルシェーダに渡す頂点情報です。
ピクセルシェーダはピクセル単位で実行され、入力は頂点シェーダから渡された頂点情報、出力はそのピクセルの色情報です。
頂点シェーダとピクセルシェーダの間には、ラスタライズという処理が入り、ここで、スクリーン上の頂点座標の並びから、ポリゴンが実際にスクリーン上に占めるピクセルの並びへと変換されます。このとき、頂点シェーダが出力した頂点情報は、各ピクセルへと展開され、ピクセルシェーダへと渡されます。
なお、ここで解説した構成は、MMEがサポートするSM3.0のもので、SM4.0以降では、より多くのシェーダのバリエーションが存在します。