最終更新: mikk_ni3_92 2010年02月23日(火) 14:47:16履歴
現在地:メニュー >> GLSL >> GLSL編05
INDEX:GLSL編04 << GLSL編05 >> GLSL編06
varyingという修飾子がついている変数は
ピクセル単位でライティングをする場合は、
頂点単位での法線情報、[頂点→光源]へのベクトルが
フラグメントシェーダではvarying変数で線形補間される。
あとは同じ。
【例】:glsl.vert
【例】:glsl.frag
INDEX:GLSL編04 << GLSL編05 >> GLSL編06
varyingという修飾子がついている変数は
- 頂点シェーダ → 様々な頂点シェーダの出力(色、法線情報など)
- フラグメントシェーダ → 頂点シェーダからわたされる入力(線形補間されている)
ピクセル単位でライティングをする場合は、
- 頂点シェーダから法線情報をうけとる
- 頂点シェーダから[頂点→光源]へのベクトルをうけとる
頂点単位での法線情報、[頂点→光源]へのベクトルが
フラグメントシェーダではvarying変数で線形補間される。
あとは同じ。
【例】:glsl.vert
//varying変数 varying vec3 normal;//法線 varying vec3 vtoL;//視点座標系での頂点→光源のベクトル //頂点シェーダ void main(void) { //投影変換 (モデルビュー * プロジェクション) * 頂点座標 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; ////各種基本的なベクトルを計算 normal = gl_NormalMatrix * gl_Normal;//法線を視点座標系にする vec4 V = gl_ModelViewMatrix * gl_Vertex;//視点座標系の頂点位置 vtoL = gl_LightSource[0].position.xyz - V.xyz;//頂点→光源へのベクトル }
【例】:glsl.frag
//varying変数 varying vec3 normal;//法線 varying vec3 vtoL;//視点座標系での頂点→光源のベクトル //フラグメント void main(void) { //// ambientの計算 //// vec4 ambient = gl_LightSource[0].ambient * gl_FrontMaterial.ambient; //// diffuse計算 //// vec3 N = normalize(normal);//正規化 vec3 L = normalize(vtoL);//正規化 float NdotL = dot(N,L); vec4 diffuse = vec4( max(0.0,NdotL) ) * gl_LightSource[0].diffuse * gl_FrontMaterial.diffuse; //// specular計算(Bilnのモデルを使用) //// vec3 H = normalize(gl_LightSource[0].halfVector.xyz); float NdotH = dot(N,H); vec4 specular = pow(max(0.0,NdotH),gl_FrontMaterial.shininess); if(NdotL <=0)//条件によってはspecular無し { specular = 0; } specular = specular* gl_LightSource[0].specular * gl_FrontMaterial.specular; gl_FragColor = ambient + diffuse + specular; }