diff --git a/index.html b/index.html
index 0fb8b9c..f2bcd52 100644
--- a/index.html
+++ b/index.html
@@ -190,77 +190,43 @@
precision mediump float;
varying vec3 v_fragPos;
- varying vec2 v_uv;
+ varying vec3 v_normal;
uniform vec3 eyePos;
- uniform sampler2D displace_map;
- vec3 lightPos = vec3(0.,0.,10.); //not used in diffuse. diffuse uses a directional light. It is only used for specular glittering.
- vec3 lightColor = vec3(1.0,1.0,1.0);
+ vec3 lightColor = vec3(1.0, 1.0, 1.0);
- //using forward difference
- //Normal vectors are compute as: https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/perlin-noise-part-2/perlin-noise-computing-derivatives
-
void main(void) {
- vec4 displace = texture2D(displace_map, v_uv);
- //calculate normal
- float gridPointDelta = (1. / 256.);
- vec3 currPoint = vec3(0.0,0.0,displace.x);
- vec3 right = vec3(gridPointDelta,0.0,texture2D(displace_map,vec2(v_uv.x + gridPointDelta,v_uv.y)).x*(1./1.));
- vec3 left = vec3(-gridPointDelta,0.0,texture2D(displace_map,vec2(v_uv.x - gridPointDelta,v_uv.y)).x*(1./1.));
- vec3 up = vec3(0.,gridPointDelta,texture2D(displace_map,vec2(v_uv.x ,v_uv.y + gridPointDelta)).x*(1./1.));
- vec3 down = vec3(0.,-gridPointDelta,texture2D(displace_map,vec2(v_uv.x ,v_uv.y - gridPointDelta)).x*(1./1.));
+ vec3 norm = normalize(v_normal);
+ vec3 lightDir = normalize(vec3(0.3, 0.5, 1.0)); // Sun direction
- //vec3 tangent = normalize(right - currPoint);
- //vec3 biTangent = normalize(up - currPoint);
- vec3 tangent = normalize(vec3(gridPointDelta,0.,right.z-left.z));
- vec3 biTangent = normalize(vec3(0.,gridPointDelta,down.z-up.z));
- //vec3 normal = biTangent;
- vec3 normal = cross(tangent, biTangent);
-
- vec3 norm = normalize(normal);
- norm.y *= -1.; //Normal y direction is somehow inverted
- //vec3 lightDir = normalize(lightPos - v_fragPos);
- vec3 lightDir = normalize(-vec3(0.0,.0,-1.)); //sun shines in drection of -z
-
- float diff = max(dot(norm,lightDir),0.0);
+ float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
- vec3 result = (diffuse) * vec3(0.0,0.0,1.0);
- //Old lightning
- vec3 toCameraVector = normalize(v_fragPos - eyePos);
- vec3 reflec = normalize(reflect(toCameraVector, norm));
+ // View direction
+ vec3 toCameraVector = normalize(eyePos - v_fragPos);
+ vec3 reflec = normalize(reflect(-toCameraVector, norm));
- //Schlicks approximation to Fresnelfactor
- float n1 = 1., n2 = 1.33333;
- float R0 = pow((n1-n2)/(n1+n2), 2.);
- float fresnel = R0 + (1. - R0)*pow((1.-dot(norm,reflec)),5.) ;
+ // Schlick's approximation to Fresnel factor
+ float n1 = 1.0, n2 = 1.33333;
+ float R0 = pow((n1 - n2) / (n1 + n2), 2.0);
+ float fresnel = R0 + (1.0 - R0) * pow(1.0 - max(dot(norm, toCameraVector), 0.0), 5.0);
- //vec3 waterColor = vec3(34./255.,154./255.,211./255.);
- vec3 oceanColor = vec3(0,.4,.4); // under-sea colour
- vec3 skyColor = vec3(1.,1.,1.);
+ vec3 oceanColor = vec3(0.0, 0.3, 0.4);
+ vec3 skyColor = vec3(0.6, 0.8, 1.0);
- //Subsurface scattering
- vec3 sssSun = vec3(0.,-5.,-7.0);
- vec3 tosssSunVec = normalize(sssSun - v_fragPos);
- vec3 tosssSun = normalize(vec3(0.0,-100.,1.));
- float ssDistortion = 0.1;
- float sssIntensity = 1.;
- vec3 halfWay = normalize(tosssSun+norm*ssDistortion);
- float ssScateringCoef = pow(clamp(dot(toCameraVector,-halfWay),0.0,1.0),5.) * sssIntensity;
- //Sun glittering
- float glitterFactor = max(0.0,dot(tosssSunVec,reflect(-toCameraVector,norm)));
- if(!(glitterFactor > 0.98)) {
- glitterFactor = 0.0;
- }
+ // Specular highlights
+ vec3 halfwayDir = normalize(lightDir + toCameraVector);
+ float spec = pow(max(dot(norm, halfwayDir), 0.0), 256.0);
+ vec3 specular = spec * lightColor * 0.8;
- //gl_FragColor = vec4(oceanColor + lightColor * glitterFactor,1.0);
- //gl_FragColor=vec4(clamp(oceanColor + (oceanColor*ssScateringCoef),0.,1.0),1.0); //Display subsurfacecatterting component
- //gl_FragColor = vec4((mix(oceanColor,skyColor,fresnel).xyz), 1.); //Just display reflection component
- //gl_FragColor = vec4(diffuse * oceanColor,1.0); //Render only diffuse component
- //gl_FragColor = vec4(normal,1.0); //show Normal map
- //gl_FragColor = vec4(displace.x,displace.x,displace.x,1.0); //Show Perlin Noise texture deactivate vertex distrotion before
- gl_FragColor = vec4((clamp(diffuse,0.97,1.0) * (mix(oceanColor + (oceanColor*ssScateringCoef),skyColor*0.8,fresnel).xyz))+ lightColor * glitterFactor, 1.0); //All combined
+ // Subsurface scattering approximation
+ float sss = pow(max(dot(toCameraVector, -lightDir), 0.0), 4.0) * 0.3;
+ vec3 sssColor = vec3(0.0, 0.5, 0.5) * sss;
+
+ vec3 finalColor = mix(oceanColor, skyColor, fresnel) * clamp(diffuse, 0.4, 1.0) + specular + sssColor;
+
+ gl_FragColor = vec4(finalColor, 1.0);
}