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
|
uniform mat4 uMatrixMvp;
uniform mat3 uMatrixNormal;
uniform mat4 uMatrixModelview;
uniform vec4 uLightPosition;
varying vec2 vFactor;
VERTEX_SHADER_USE_SHADOWS
VERTEX_SHADER_USE_POSITION
VERTEX_SHADER_USE_NORMALS
VERTEX_SHADER_USE_TEXCOORD
VERTEX_SHADER_NEED_TEX_COORD
#ifdef LIGHT_SPOT
uniform vec3 uLightSpotDir;
uniform float uLightSpotExp;
uniform float uLightSpotCutoffCos;
#endif //LIGHT_SPOT
#ifdef SPECULAR
uniform float uMaterialShininess;
#endif //SPECULAR
#ifdef LIGHT_ATTENUATION
uniform vec3 uLightAtten;
#endif //LIGHT_ATTENUATION
void vertexFlat(vec4 position, vec3 normal)
{
vec3 lv;
float factor;
normal = uMatrixNormal * normal;
position = uMatrixModelview * position;
#ifdef NORMALIZE_NORMALS
normal = normalize(normal);
#endif //NORMALIZE_NORMALS
#ifdef LIGHT_DIRECTIONAL
lv = uLightPosition.xyz;
#else
lv = uLightPosition.xyz - position.xyz;
lv = normalize(lv);
#endif //LIGHT_DIRECTIONAL
factor = max(dot(lv, normal), 0.0);
#ifdef LIGHT_SPOT
float f = dot(-lv, uLightSpotDir);
if (f > uLightSpotCutoffCos)
factor *= pow(f, uLightSpotExp);
else
factor = 0.0;
#endif //LIGHT_SPOT
if (factor > 0.0)
{
#ifdef DIFFUSE
vFactor.x = factor;
#else
vFactor.x = 0.0;
#endif //DIFFUSE
#ifdef SPECULAR
vec3 hv = normalize(normalize(-position.xyz) + lv);
factor = pow(max(dot(hv, normal), 0.0), uMaterialShininess);
vFactor.y = factor;
#endif //SPECULAR
}
else
vFactor = vec2(0.0, 0.0);
/* Light attenuation. */
#ifdef LIGHT_ATTENUATION
float dist = length(lv);
vFactor /= dot(uLightAtten, vec3(1.0, dist, dist * dist));
#endif //LIGHT_ATTENUATION
}
void main()
{
VERTEX_SHADER_POSITION
VERTEX_SHADER_NORMAL
VERTEX_SHADER_TEXCOORD
gl_Position = uMatrixMvp * position;
vertexFlat(position, normal);
VERTEX_SHADER_SHADOWED
}
|