I am Charmie

メモとログ

04_varying_parameter_program

今回は,varying parameterとやらの話.
C2E1v_green,C3E1v_anyColorどちらのシェーダプログラムでも,バーテックス毎に異なるパラメータがあった.セマンティック変数のPOSITIONの事.これは,GPUが各position parameterを,プログラムによって処理されるバーテックスの入力座標で初期化している事を示してる.
セマンティック変数を入力とする事で,Cgプログラムのパラメータをバーテックス毎やフラグメント毎に異なる値で初期化できるようになる.
今回のバーテックスシェーダはそのようになっている.

struct C3E2v_Output {
float4 position : POSITION;
float3 color : COLOR;
float2 texCoord : TEXCOORD0;
};

C3E2v_Output C3E2v_varying(float2 position : POSITION,
float3 color : COLOR,
float2 texCoord : TEXCOORD0)
{
C3E2v_Output OUT;

OUT.position = float4(position,0,1);
OUT.color = color;
OUT.texCoord = texCoord;

return OUT;
}

前回のシェーダはユニフォーム変数によってカラーを返していたために同じカラーを出力していた.今回は,カラーに関する引数を二つのセマンティック変数(colorとtexCoord)にしている.
返戻値として,position,color,texCoordを返すが,フラグメントシェーダは入力としてcolorのみを扱うため,ここではtexCoordがどのような影響を及ぼすか分からない.
GL側では以下のように設定していて,三頂点(それぞれ赤,青,緑)の間のフラグメントの色が内挿された三角形が表示される.
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0); / Red /
glVertex2f(-0.8, 0.8);

glColor3f(0, 1, 0); / Green /
glVertex2f(0.8, 0.8);

glColor3f(0, 0, 1); / Blue /
glVertex2f(0.0, -0.8);
glEnd();