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
|
#version 330 core
in VS_OUT {
vec3 fpos;
vec3 fn;
vec2 texc;
} fsin;
out vec4 fcolor;
uniform sampler2D diftex;
const int lmax = 30;
uniform int lcount;
uniform vec3 lpos[lmax];
uniform vec3 vpos;
void main(void)
{
vec3 l, v, n, difcolor, lcolor, ambient, halfdir, result;
float diff, spec, specf, dist, attenuation;
int i;
n = normalize(fsin.fn);
v = normalize(vpos-fsin.fpos);
ambient = vec3(0.001);
difcolor = vec3(texture(diftex, fsin.texc));
/* lcolor = vec3(0.3, 0.0, 0.1); */
lcolor = vec3(1.0);
specf = 0.2;
result = vec3(0.0);
for (i = 0; i < lcount; i++) {
l = normalize(lpos[i]-fsin.fpos);
halfdir = normalize(l+v);
diff = max(dot(n, l), 0.0);
spec = pow(max(dot(n, halfdir), 0.0), 16.0)*specf;
dist = length(lpos[i]-fsin.fpos);
attenuation = 1.0/dist;
result += (diff+spec)*difcolor*lcolor*attenuation;
}
fcolor = vec4(ambient+result, 1.0);
}
|