現在地メニュー >> GLSL >> GLSL編03
INDEX:GLSL編02 << GLSL編03 >> GLSL編04

GLSLとuniform変数


シェーダ側にはuniform変数というものがある。
これは、シェーダが呼び出され実行される時に変化しない定数で、CPUから渡されてくるもの。

シェーダが呼ばれても変化しない、CPUから渡される定数がuniform変数である。

CPUからGPUへ値を渡す

シェーダでの宣言

シェーダでは、外部変数のように変数名を宣言すればよい。
uniform vec3 lightPos;//光源位置

//頂点シェーダ
void main(void)
{
	… …
}

CPUから渡す


CPUから、GPUへわたすには
  1. 名前の関連付け
  2. 値設定
となる。

【例】
float lightPosition[3] = {-3,4,5};
GLint litPosId;

… …
glUseProgram(programId);

litPosId = glGetUniformLocation(programId,"lightPos");//シェーダでの名前を関連付ける
glUniform3fv(litPosId,1,lightPosition);//値設定(3要素の配列を1つ分)
▲このように、glGetUniformLocation関数で関連付けを行う。
返り値を識別子にしてglUniform関数で具体的な値を設定する。

ただし注意点としては
glUseProgramで有効にしているシェーダプログラムに適用される
という点。

簡単なライティング


ここでは視点座標系で簡単な頂点シェーダのライティングを行ってみる。
(簡単にするため、diffuseのみをやります)


すると、頂点シェーダは次のようになる。
uniform vec3 lightPos;//光源位置(視点座標系)

//頂点シェーダ
void main(void)
{
	//投影変換 (モデルビュー * プロジェクション) * 頂点座標
	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
	
	vec3 N = normalize(gl_NormalMatrix * gl_Normal);
	vec4 V = gl_ModelViewMatrix * gl_Vertex;
	vec3 L = normalize(lightPos - V.xyz);

	float NdotL = dot(N,L);
	gl_FrontColor = gl_Color * vec4( max(0.0,NdotL) );
}
▲詳細は略。「gl_NormalMatrix」は「オブジェクト座標系」の法線データを「視点座標系」に変換する行列。

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます