waterFragment.glsl 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #version 400 core
  2. in vec4 clipSpace;
  3. in vec2 textureCoords;
  4. in vec3 toCameraVector;
  5. in vec3 fromLightVector[4]; //4 max light sources
  6. layout (location = 0) out vec4 out_Color;
  7. layout (location = 1) out vec4 out_BrightColor;
  8. uniform sampler2D reflectionTexture;
  9. uniform sampler2D refractionTexture;
  10. uniform sampler2D dudvMap;
  11. uniform sampler2D normalMap;
  12. uniform sampler2D depthMap;
  13. uniform vec3 lightColor[4]; //4 max light sources
  14. uniform vec3 attenuation[4];
  15. uniform float moveFactor;
  16. uniform float waveStrength;
  17. uniform float shineDamper;
  18. uniform float reflectivity;
  19. uniform float nearPlane;
  20. uniform float farPlane;
  21. void main(void) {
  22. vec2 ndc = (clipSpace.xy / clipSpace.w) / 2.0 + 0.5;
  23. vec2 refractTexCoords = vec2(ndc.x, ndc.y);
  24. vec2 reflectTexCoords = vec2(ndc.x, -ndc.y);
  25. float depth = texture(depthMap, refractTexCoords).r;
  26. float floorDistance = 2.0 * nearPlane * farPlane / (farPlane + nearPlane - (2.0 * depth - 1.0) * (farPlane - nearPlane));
  27. depth = gl_FragCoord.z;
  28. float waterDistance = 2.0 * nearPlane * farPlane / (farPlane + nearPlane - (2.0 * depth - 1.0) * (farPlane - nearPlane));
  29. float waterDepth = floorDistance - waterDistance;
  30. vec2 distortedTexCoords = texture(dudvMap, vec2(textureCoords.x + moveFactor, textureCoords.y)).rg * 0.1;
  31. distortedTexCoords = textureCoords + vec2(distortedTexCoords.x, distortedTexCoords.y + moveFactor);
  32. vec2 totalDistortion = (texture(dudvMap, distortedTexCoords).rg * 2.0 -1.0) * waveStrength * clamp(waterDepth/20.0, 0.0, 1.0);
  33. refractTexCoords += totalDistortion;
  34. refractTexCoords = clamp(refractTexCoords, 0.001, 0.999);
  35. reflectTexCoords += totalDistortion;
  36. reflectTexCoords.x = clamp(reflectTexCoords.x, 0.001, 0.999);
  37. reflectTexCoords.y = clamp(reflectTexCoords.y, -0.999, -0.001);
  38. vec4 reflectColor = texture(reflectionTexture, reflectTexCoords);
  39. vec4 refractColor = texture(refractionTexture, refractTexCoords);
  40. vec4 normalMapColor = texture(normalMap, distortedTexCoords);
  41. vec3 normal = vec3(normalMapColor.r * 2.0 - 1.0, normalMapColor.b * 3.0, normalMapColor.g * 2.0 - 1.0);
  42. normal = normalize(normal);
  43. vec3 viewVector = normalize(toCameraVector);
  44. float refractiveFactor = dot(viewVector, normal);
  45. refractiveFactor = pow(refractiveFactor, 1.0); // More or less reflective
  46. refractiveFactor = clamp(refractiveFactor, 0.0, 1.0);
  47. vec3 specularHighlights = vec3(0.0);
  48. for (int i = 0; i < 4; i++) {
  49. float distance = length(fromLightVector[i]);
  50. float attFactor = attenuation[i].x + (attenuation[i].y * distance) + (attenuation[i].z * distance * distance);
  51. vec3 reflectedLight = reflect(normalize(fromLightVector[i]), normal);
  52. float specular = max(dot(reflectedLight, viewVector), 0.0);
  53. specular = pow(specular, shineDamper);
  54. specularHighlights = specularHighlights + (lightColor[i] * specular * reflectivity * clamp(waterDepth/20.0, 0.0, 1.0))/attFactor;
  55. }
  56. out_Color = mix(reflectColor, refractColor, refractiveFactor);
  57. out_Color = mix(out_Color, vec4(0.0, 0.3, 0.5, 1.0), 0.2) + vec4(specularHighlights, 0.0);
  58. out_Color.a = clamp(waterDepth/5.0, 0.0, 1.0);
  59. out_BrightColor = vec4(0.0);
  60. }