summaryrefslogtreecommitdiff
path: root/shaders/humus-dynamicbranching/7.frag
blob: f85598368a6aeee21d159095d880a4c84dafc7a2 (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
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;
}