最終更新: mikk_ni3_92 2010年02月18日(木) 19:04:55履歴
現在地:メニュー >> GLSL >> GLSL編03
INDEX:GLSL編02 << GLSL編03 >> GLSL編04
シェーダ側にはuniform変数というものがある。
これは、シェーダが呼び出され実行される時に変化しない定数で、CPUから渡されてくるもの。
シェーダが呼ばれても変化しない、CPUから渡される定数がuniform変数である。
CPUから、GPUへわたすには
【例】
返り値を識別子にしてglUniform関数で具体的な値を設定する。
ただし注意点としては
glUseProgramで有効にしているシェーダプログラムに適用される
という点。
ここでは視点座標系で簡単な頂点シェーダのライティングを行ってみる。
(簡単にするため、diffuseのみをやります)
すると、頂点シェーダは次のようになる。
INDEX:GLSL編02 << GLSL編03 >> GLSL編04
シェーダ側にはuniform変数というものがある。
これは、シェーダが呼び出され実行される時に変化しない定数で、CPUから渡されてくるもの。
シェーダが呼ばれても変化しない、CPUから渡される定数がuniform変数である。
CPUから、GPUへわたすには
- 名前の関連付け
- 値設定
【例】
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」は「オブジェクト座標系」の法線データを「視点座標系」に変換する行列。