rev |
line source |
nuclear@0
|
1 #version 110
|
nuclear@0
|
2
|
nuclear@0
|
3 varying vec3 pos, normal;
|
nuclear@0
|
4
|
nuclear@0
|
5 uniform float rough, specularity, ior;
|
nuclear@0
|
6 uniform float dif_sdr, spec_sdr;
|
nuclear@0
|
7
|
nuclear@0
|
8 #define DSDR_LAMBERT 0.0
|
nuclear@0
|
9 #define DSDR_OREN_NAYAR 1.0
|
nuclear@0
|
10
|
nuclear@0
|
11 #define SSDR_PHONG 0.0
|
nuclear@0
|
12 #define SSDR_BLINN 1.0
|
nuclear@0
|
13 #define SSDR_COOK_TORR 2.0
|
nuclear@0
|
14
|
nuclear@0
|
15 #define EQ(a, b) (abs((a) - (b)) < 0.5)
|
nuclear@0
|
16
|
nuclear@0
|
17 float lambert(vec3 norm, vec3 ldir);
|
nuclear@0
|
18 float oren_nayar(vec3 view, vec3 norm, vec3 ldir, float rough);
|
nuclear@0
|
19
|
nuclear@0
|
20 float phong(vec3 view, vec3 norm, vec3 ldir, float spow);
|
nuclear@0
|
21 float blinn(vec3 norm, vec3 hvec, float spow);
|
nuclear@0
|
22 float cook_torrance(vec3 view, vec3 norm, vec3 ldir, vec3 hvec, float rough, float ior);
|
nuclear@0
|
23
|
nuclear@0
|
24 void main()
|
nuclear@0
|
25 {
|
nuclear@0
|
26 vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
|
nuclear@0
|
27 float idiff, ispec;
|
nuclear@0
|
28
|
nuclear@0
|
29 vec3 view = -normalize(pos);
|
nuclear@0
|
30 vec3 norm = normalize(normal);
|
nuclear@0
|
31 vec3 ldir = normalize(gl_LightSource[0].position.xyz - pos);
|
nuclear@0
|
32
|
nuclear@0
|
33 if(EQ(dif_sdr, DSDR_LAMBERT)) {
|
nuclear@0
|
34 idiff = lambert(norm, ldir);
|
nuclear@0
|
35 } else if(EQ(dif_sdr, DSDR_OREN_NAYAR)) {
|
nuclear@0
|
36 idiff = oren_nayar(view, norm, ldir, rough);
|
nuclear@0
|
37 } else {
|
nuclear@0
|
38 idiff = 0.0;
|
nuclear@0
|
39 }
|
nuclear@0
|
40
|
nuclear@0
|
41 vec4 mcolor = gl_FrontMaterial.diffuse;
|
nuclear@0
|
42
|
nuclear@0
|
43 if(EQ(spec_sdr, SSDR_PHONG)) {
|
nuclear@0
|
44 ispec = phong(view, norm, ldir, gl_FrontMaterial.shininess);
|
nuclear@0
|
45 color = mcolor * idiff + vec4(specularity, specularity, specularity, 1.0) * ispec;
|
nuclear@0
|
46 } else if(EQ(spec_sdr, SSDR_BLINN)) {
|
nuclear@0
|
47 ispec = blinn(norm, gl_LightSource[0].halfVector.xyz, gl_FrontMaterial.shininess);
|
nuclear@0
|
48 color = mcolor * idiff + vec4(specularity, specularity, specularity, 1.0) * ispec;
|
nuclear@0
|
49 } else if(EQ(spec_sdr, SSDR_COOK_TORR)) {
|
nuclear@0
|
50 ispec = cook_torrance(view, norm, ldir, gl_LightSource[0].halfVector.xyz, rough, ior);
|
nuclear@0
|
51 color = specularity * ispec * mcolor + (1.0 - specularity) * idiff * mcolor;
|
nuclear@0
|
52 } else {
|
nuclear@0
|
53 color = vec4(1.0, 0.0, 0.0, 1.0);
|
nuclear@0
|
54 }
|
nuclear@0
|
55 color.a = 1.0;
|
nuclear@0
|
56
|
nuclear@0
|
57 gl_FragColor = color;
|
nuclear@0
|
58 }
|