1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*
* lighting.frag
*
* Lighting calculations
*
* (c) 2007-2008 Thomas White <taw27@cam.ac.uk>
*
* thrust3d - a silly game
*
*/
varying vec3 normal;
varying vec3 light0vc;
varying vec3 light1vc;
varying vec3 light2vc;
varying vec3 light2hvc;
uniform sampler2D texture;
uniform bool fill_light_enabled;
uniform bool texture_enabled;
uniform bool texture_emits;
uniform float alpha;
varying vec3 col_ambi_diff;
varying vec3 col_emit;
void main() {
vec3 ambi;
vec3 emit;
vec3 diff = vec3(0.0, 0.0, 0.0);
vec3 spec = vec3(0.0, 0.0, 0.0);
vec3 norm = normalize(normal);
float ndothv = max(dot(norm, normalize(light2hvc)), 0.0);
/* Ambient */
ambi = col_ambi_diff * gl_LightModel.ambient.rgb;
/* Emission */
emit = col_emit;
/* Fill-in light (light 2) */
if ( fill_light_enabled ) {
diff += col_ambi_diff * gl_LightSource[2].diffuse.rgb * max(dot(vec3(light1vc), norm), 0.0);
spec += gl_LightSource[2].specular.rgb * pow(ndothv, 80.0);
} else {
/* Spotlight (light 0) - positional, spotlight */
float falloff = 1/ ( gl_LightSource[0].constantAttenuation
+ gl_LightSource[0].linearAttenuation * length(light0vc)
+ gl_LightSource[0].quadraticAttenuation * pow(length(light0vc), 2.0) );
float spot = max(dot(normalize(-light0vc), gl_LightSource[0].spotDirection), 0.0);
spot = pow(spot, gl_LightSource[0].spotExponent);
diff += col_ambi_diff * gl_LightSource[0].diffuse.rgb * spot * falloff * max(dot(normalize(light0vc).xyz, norm), 0.0);
spec += vec3(1.0, 1.0, 1.0) * gl_LightSource[0].specular.rgb * pow(ndothv, 80.0);
/* Background glow (light 1) - diffuse only, directional */
diff += col_ambi_diff * gl_LightSource[1].diffuse.rgb * max(dot(vec3(light1vc), norm), 0.0);
}
if ( texture_enabled ) {
vec3 tex = texture2D(texture, gl_TexCoord[0].st).rgb;
if ( texture_emits ) {
gl_FragColor = vec4(min(emit.r + ambi.r + diff.r + spec.r + tex.r, 1.0),
min(emit.g + ambi.g + diff.g + spec.g + tex.g, 1.0),
min(emit.b + ambi.b + diff.b + spec.b + tex.b, 1.0),
alpha);
} else {
gl_FragColor = vec4(tex.r * min(emit.r + ambi.r + diff.r + spec.r, 1.0),
tex.g * min(emit.g + ambi.g + diff.g + spec.g, 1.0),
tex.b * min(emit.b + ambi.b + diff.b + spec.b, 1.0),
alpha);
}
} else {
gl_FragColor = vec4(min(emit.r + ambi.r + diff.r + spec.r, 1.0),
min(emit.g + ambi.g + diff.g + spec.g, 1.0),
min(emit.b + ambi.b + diff.b + spec.b, 1.0),
alpha);
}
}
|