I am Charmie

メモとログ

01_vertex_program pt.2

次に,シェーダでどんな事をしているか.
今回のシェーダ(C2E1v_green.cg)は処理が単純過ぎるので,一般的な話から.
Cg言語では,OpenGL側から受け取るデータは全て関数の引数として受け取る必要がある.
関数が受け取る引数には2種類あって,ユニフォーム変数とセマンティック変数がある.
セマンティック変数は,頂点座標や法線ベクトルといった,シェーダが呼ばれる度(バーテックスシェーダの場合,頂点座標が変わる度)に値が変わる変数を表す.
一方で,ユニフォーム変数は,モデルビュー行列や光源位置といった,シェーダが呼ばれても変わらない,一定の値を持つ変数を表す.
セマンティック変数は,以下のように記述し,
float3 color : COLOR
ユニフォーム変数は,以下のように記述する.
uniform float3 constantColor

というわけで,C2E1v_green.cgのコードを見てみる.
struct C2E1v_Output {
float4 position : POSITION;
float3 color : COLOR;
};

C2E1v_Output C2E1v_green(float2 position : POSITION)
{
C2E1v_Output OUT;
OUT.position = float4(position,0,1);
OUT.color = float3(0,1,0);
return OUT;
}
入力は頂点座標のみで,これはセマンティック変数.出力は座標と座標の色.
このバーテックスシェーダは全ての頂点を緑色(float3(0,1,0))にするシェーダ処理をする.

実際にプログラムを実行すると,全ての頂点が緑色をした三角形が表示される.