0001: // ------------------------------------------------------------
0002: // Phong シェーディング (slang:fragment program)
0003: // 
0004: // Copyright (c) 2003 IMAGIRE Takashi. All rights reserved.
0005: // ------------------------------------------------------------
0006: 
0007: // -------------------------------------------------------------
0008: // 頂点プログラムからフラグメントプログラムに渡すデータ
0009: // -------------------------------------------------------------
0010: varying vec3 VERTEX_COLOR;
0011: varying vec3 VERTEX_EYE;
0012: varying vec3 VERTEX_NORMAL;
0013: varying vec3 VERTEX_LIGHT;
0014: 
0015: // ------------------------------------------------------------
0016: // フラグメントシェーダプログラム
0017: // ------------------------------------------------------------
0018: void main (void)
0019: {
0020:     vec3 N = normalize(VERTEX_NORMAL);  // 法線ベクトル
0021:     vec3 L = normalize(VERTEX_LIGHT);   // ライトベクトル
0022:     vec3 E = normalize(VERTEX_EYE);     // 視線ベクトル
0023:     vec3 R = reflect(L, N);             // 反射ベクトル
0024:     
0025:     // Phong speqular
0026:     float spec = pow(max(dot(R, E), 0.0), 50.0);
0027:     
0028:     gl_FragColor = vec4 (VERTEX_COLOR, 1.0)         // 頂点色
0029:                          * vec4(max(dot(N,L), 0.0)) // Lambert 拡散強度
0030:                  + vec4 (0.8) * vec4 (spec);        // 鏡面反射色
0031: }
0032: