blob: 2879f189d3589b03236b7f2997428b073e97544a (
plain)
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
|
const int MAX_LIGHTS = 8;
struct Light {
FP vec3 position;
FP vec3 color;
FP float intensity;
FP vec3 direction;
FP vec3 attenuation;
// FP float cutOffAngle;
};
uniform Light lights[MAX_LIGHTS];
uniform int lightCount;
void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 eye, const in FP float shininess,
out FP vec3 diffuseColor, out FP vec3 specularColor)
{
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
FP vec3 n = normalize( vnormal );
// TODO dynamic indexing may not be supported with GLSL 1.00 so take only the first light into account
FP vec3 lightDir = lights[0].direction;
FP float att = 1.0;
if (length( lightDir ) == 0.0) {
lightDir = lights[0].position - vpos;
if (length( lights[0].attenuation ) != 0.0) {
FP float dist = length(lightDir);
att = 1.0 / (lights[0].attenuation.x + lights[0].attenuation.y * dist + lights[0].attenuation.z * dist * dist);
}
}
FP vec3 s = normalize( lightDir );
FP float diffuse = max( dot( s, n ), 0.0 );
FP float specular = 0.0;
if (diffuse > 0.0 && shininess > 0.0) {
FP vec3 r = reflect( -s, n );
FP vec3 v = normalize( eye - vpos );
FP float normFactor = ( shininess + 2.0 ) / 2.0;
specular = normFactor * pow( max( dot( r, v ), 0.0 ), shininess );
}
diffuseColor += att * lights[0].intensity * diffuse * lights[0].color;
specularColor += specular;
}
|