|
@@ -1,3 +1,7 @@
|
|
|
+#ifdef LOGARITHMICDEPTH
|
|
|
+#extension GL_EXT_frag_depth : enable
|
|
|
+#endif
|
|
|
+
|
|
|
precision highp float;
|
|
|
|
|
|
// Constants
|
|
@@ -51,6 +55,7 @@ varying vec3 vReflectionMapTexCoord;
|
|
|
varying vec3 vPosition;
|
|
|
|
|
|
#include<clipPlaneFragmentDeclaration>
|
|
|
+#include<logDepthDeclaration>
|
|
|
|
|
|
// Fog
|
|
|
#include<fogFragmentDeclaration>
|
|
@@ -69,7 +74,8 @@ void main(void) {
|
|
|
float alpha = vDiffuseColor.a;
|
|
|
|
|
|
#ifdef BUMP
|
|
|
- baseColor = texture2D(normalSampler, vNormalUV);
|
|
|
+ //smaller bumps superimposed (better moving waves, no "conveyor belt" look):
|
|
|
+ baseColor = (texture2D(normalSampler, vNormalUV) + texture2D(normalSampler,vec2(-vNormalUV.y*0.33,vNormalUV.x*0.33)))/2.0;
|
|
|
vec3 bumpColor = baseColor.rgb;
|
|
|
|
|
|
#ifdef ALPHATEST
|
|
@@ -88,8 +94,9 @@ void main(void) {
|
|
|
|
|
|
// Bump
|
|
|
#ifdef NORMAL
|
|
|
- vec3 normalW = normalize(vNormalW);
|
|
|
+ //reflection angle is also perturbed
|
|
|
vec2 perturbation = bumpHeight * (baseColor.rg - 0.5);
|
|
|
+ vec3 normalW = normalize(vNormalW + vec3(perturbation.x*3.0,perturbation.y*3.0,0.0));
|
|
|
#else
|
|
|
vec3 normalW = vec3(1.0, 1.0, 1.0);
|
|
|
vec2 perturbation = bumpHeight * (vec2(1.0, 1.0) - 0.5);
|
|
@@ -101,17 +108,21 @@ void main(void) {
|
|
|
|
|
|
vec2 projectedRefractionTexCoords = clamp(vRefractionMapTexCoord.xy / vRefractionMapTexCoord.z + perturbation, 0.0, 1.0);
|
|
|
vec4 refractiveColor = texture2D(refractionSampler, projectedRefractionTexCoords);
|
|
|
-
|
|
|
+
|
|
|
+ //refraction (sea bed) combined with the water color: TODO: fog-like shallow underwater
|
|
|
+ refractiveColor = colorBlendFactor*waterColor + (1.0-colorBlendFactor)*refractiveColor;
|
|
|
+
|
|
|
vec2 projectedReflectionTexCoords = clamp(vReflectionMapTexCoord.xy / vReflectionMapTexCoord.z + perturbation, 0.0, 1.0);
|
|
|
vec4 reflectiveColor = texture2D(reflectionSampler, projectedReflectionTexCoords);
|
|
|
|
|
|
vec3 upVector = vec3(0.0, 1.0, 0.0);
|
|
|
-
|
|
|
- float fresnelTerm = max(dot(eyeVector, upVector), 0.0);
|
|
|
+
|
|
|
+ //physically correct water reflection by look angle
|
|
|
+ float fresnelTerm = min(0.95, pow(max(dot(eyeVector, upVector), 0.0),1.5));
|
|
|
|
|
|
vec4 combinedColor = refractiveColor * fresnelTerm + reflectiveColor * (1.0 - fresnelTerm);
|
|
|
|
|
|
- baseColor = colorBlendFactor * waterColor + (1.0 - colorBlendFactor) * combinedColor;
|
|
|
+ baseColor = combinedColor;
|
|
|
#endif
|
|
|
|
|
|
// Lighting
|
|
@@ -134,16 +145,18 @@ void main(void) {
|
|
|
#endif
|
|
|
|
|
|
#ifdef SPECULARTERM
|
|
|
- vec3 finalSpecular = specularBase * specularColor;
|
|
|
+ //specular glare: more concentrated (no flat surface, specular is only for hard lights)
|
|
|
+ vec3 finalSpecular = specularBase * 2.0 * specularColor * specularColor;
|
|
|
#else
|
|
|
vec3 finalSpecular = vec3(0.0);
|
|
|
#endif
|
|
|
|
|
|
- vec3 finalDiffuse = clamp(diffuseBase * diffuseColor, 0.0, 1.0) * baseColor.rgb;
|
|
|
+ vec3 finalDiffuse = clamp(baseColor.rgb, 0.0, 1.0);
|
|
|
|
|
|
// Composition
|
|
|
vec4 color = vec4(finalDiffuse + finalSpecular, alpha);
|
|
|
|
|
|
+#include<logDepthFragment>
|
|
|
#include<fogFragment>
|
|
|
|
|
|
gl_FragColor = color;
|