reworked lighting uniforms
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / vblend.fs
1 out vec4 FragColor;
2
3 uniform sampler2D uTexGarbage;
4 uniform sampler2D uTexGradients;
5 uniform sampler2D uTexDepth;
6 uniform vec4 uDepthBounds;
7 uniform vec3 uCamera;
8 uniform vec4 uPlane;
9
10 in vec4 aColour;
11 in vec2 aUv;
12 in vec3 aNorm;
13 in vec3 aCo;
14
15 float water_depth( vec3 pos, vec3 dir, vec4 plane )
16 {
17 float d = dot( plane.xyz, dir );
18 float t = dot((plane.xyz*plane.w - pos),plane.xyz) / d;
19 return t*0.04;
20 }
21
22 float sample_height( vec3 pos )
23 {
24 vec2 depth_coords = (pos.xz-uDepthBounds.xy)*uDepthBounds.zw;
25 return texture( uTexDepth, depth_coords ).r;
26 }
27
28 float create_shadowing( vec3 vdir )
29 {
30 return clamp( sample_height( aCo+vdir ) - (aCo.y+vdir.y), 0.1, 0.2 )-0.1;
31 }
32
33 void main()
34 {
35 vec4 wgarbage = texture( uTexGarbage, aCo.xz * 0.160 );
36
37 // Creating normal patches
38 vec3 modnorm = (wgarbage.rgb-0.4) * 1.4;
39 vec3 qnorm = normalize(floor(aNorm*4.0+modnorm)*0.25) + vec3(0.001,0.0,0.0);
40
41 vec3 tangent0 = normalize(cross(qnorm,vec3(0.0,1.0,0.0)));
42 vec3 tangent1 = cross(qnorm,tangent0);
43 vec2 uvdiffuse = vec2( dot(tangent0,aCo), dot(tangent1,aCo) ) * 0.160;
44
45 // Patch local noise
46 vec4 rgarbage = texture( uTexGarbage, uvdiffuse );
47
48 // Colour blending
49 float fblendclip = step(0.380,aColour.r + (rgarbage.r-0.5)*-1.740)*0.320;
50 vec2 uvgradients = aUv + vec2( fblendclip, 0.0 );
51
52 vec3 diffuse = texture( uTexGradients, uvgradients ).rgb;
53 diffuse -= rgarbage.a*0.04;
54
55 // Lighting
56 vec3 lightdir = normalize(vec3(0.5,0.5,-0.1));
57 vec3 shadow = vec3(0.27,0.25,0.34);
58 float light1 = dot( lightdir, aNorm )*0.5+0.5;
59 diffuse = diffuse * (light1*vec3(1.0,0.96,0.9)*1.2 + shadow*(1.0-light1));
60
61 // Specular lighting
62 vec3 halfview = normalize( uCamera - aCo );
63 vec3 specdir = reflect( -lightdir, qnorm );
64 float spec = pow(max(dot(halfview,specdir),0.0),10.0) * 0.3*rgarbage.r;
65 //diffuse += spec * vec3(1.0,0.8,0.8);
66
67 float faccum = 0.0;
68 vec3 offs = vec3(rgarbage.x, 0.0, rgarbage.z)*4.0;
69 faccum += create_shadowing( vec3( 0.0, 0.5, 0.0 )*0.6);
70 faccum += create_shadowing( vec3( 2.0, 0.3, 0.0 )*0.6);
71 faccum += create_shadowing( vec3( 3.0, 1.0, 0.0 )*0.6);
72 faccum += create_shadowing( vec3( 5.0, 1.0, 0.0 )*0.6);
73 faccum += create_shadowing( vec3( 0.0, 0.5, 0.0 )*0.6*1.5+offs);
74 faccum += create_shadowing( vec3( 2.0, 0.3, 0.0 )*0.6*1.5);
75 faccum += create_shadowing( vec3( 3.0, 1.0, 0.0 )*0.6*1.5-offs);
76 faccum += create_shadowing( vec3( 5.0, 1.0, 0.0 )*0.6*1.5);
77 diffuse = mix( diffuse, vec3(0.15,0.1,0.2), min(faccum*1.0,1.0));
78
79 FragColor = vec4(diffuse, water_depth(aCo,halfview,uPlane));
80 }