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
|
#version 120
#define saturate(x) clamp(x,0.0,1.0)
#define lerp mix
#define SHADOWS
#define BRANCHING
#define LIGHT_COUNT 3
#line 43
uniform sampler2D Base;
uniform sampler2D Bump;
uniform samplerCube ShadowMap;
uniform vec3 lightColor[LIGHT_COUNT];
uniform vec2 plxCoeffs;
uniform bool hasParallax;
varying vec3 lVec[LIGHT_COUNT];
varying vec2 texCoord;
varying vec3 vVec;
#ifdef SHADOWS
varying vec3 shadowVec[LIGHT_COUNT];
#endif
void main(){
// float atten[LIGHT_COUNT];
vec3 atten;
for (int i = 0; i < LIGHT_COUNT; i++){
atten[i] = 1.0 - dot(lVec[i], lVec[i]);
}
atten = max(atten, 0.0);
vec3 viewVec = normalize(vVec);
vec2 plxTexCoord = texCoord;
if (hasParallax){
float height = texture2D(Bump, texCoord).w;
float offset = height * plxCoeffs.x + plxCoeffs.y;
plxTexCoord += offset * viewVec.xy;
}
vec3 base = texture2D(Base, plxTexCoord).rgb;
vec3 lighting = 0.1 * base;
#ifdef BRANCHING
if (dot(atten, atten) > 0.0)
#endif
{
vec3 bump = texture2D(Bump, plxTexCoord).xyz * 2.0 - 1.0;
bump = normalize(bump);
vec3 reflVec = reflect(-viewVec, bump);
for (int i = 0; i < LIGHT_COUNT; i++){
#ifndef BRANCHING
atten[i] *= float(lVec[i].z > 0.0);
#else
if (atten[i] > 0.0)
if (lVec[i].z > 0.0)
#endif
{
#ifdef SHADOWS
# ifndef BRANCHING
atten[i] *= float(length(shadowVec[i]) < textureCube(ShadowMap, shadowVec[i])[i]);
# else
if (length(shadowVec[i]) < textureCube(ShadowMap, shadowVec[i])[i])
# endif
#endif
{
vec3 lightVec = normalize(lVec[i]);
float diffuse = saturate(dot(lightVec, bump));
float specular = pow(saturate(dot(reflVec, lightVec)), 16.0);
lighting += atten[i] * lightColor[i] * (diffuse * base + 0.6 * specular);
}
}
}
}
gl_FragColor.rgb = lighting;
}
|