water.fragment.fx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. precision highp float;
  2. // Constants
  3. uniform vec3 vEyePosition;
  4. uniform vec4 vDiffuseColor;
  5. #ifdef SPECULARTERM
  6. uniform vec4 vSpecularColor;
  7. #endif
  8. // Input
  9. varying vec3 vPositionW;
  10. #ifdef NORMAL
  11. varying vec3 vNormalW;
  12. #endif
  13. #ifdef VERTEXCOLOR
  14. varying vec4 vColor;
  15. #endif
  16. // Lights
  17. #include<lightFragmentDeclaration>[0..maxSimultaneousLights]
  18. #include<lightsFragmentFunctions>
  19. #include<shadowsFragmentFunctions>
  20. // Samplers
  21. #ifdef BUMP
  22. varying vec2 vNormalUV;
  23. uniform sampler2D normalSampler;
  24. uniform vec2 vNormalInfos;
  25. #endif
  26. uniform sampler2D refractionSampler;
  27. uniform sampler2D reflectionSampler;
  28. // Water uniforms
  29. const float LOG2 = 1.442695;
  30. uniform vec3 cameraPosition;
  31. uniform vec4 waterColor;
  32. uniform float colorBlendFactor;
  33. uniform float bumpHeight;
  34. // Water varyings
  35. varying vec3 vRefractionMapTexCoord;
  36. varying vec3 vReflectionMapTexCoord;
  37. varying vec3 vPosition;
  38. #include<clipPlaneFragmentDeclaration>
  39. // Fog
  40. #include<fogFragmentDeclaration>
  41. void main(void) {
  42. // Clip plane
  43. #include<clipPlaneFragment>
  44. vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
  45. // Base color
  46. vec4 baseColor = vec4(1., 1., 1., 1.);
  47. vec3 diffuseColor = vDiffuseColor.rgb;
  48. // Alpha
  49. float alpha = vDiffuseColor.a;
  50. #ifdef BUMP
  51. baseColor = texture2D(normalSampler, vNormalUV);
  52. vec3 bumpColor = baseColor.rgb;
  53. #ifdef ALPHATEST
  54. if (baseColor.a < 0.4)
  55. discard;
  56. #endif
  57. baseColor.rgb *= vNormalInfos.y;
  58. #else
  59. vec3 bumpColor = vec3(1.0);
  60. #endif
  61. #ifdef VERTEXCOLOR
  62. baseColor.rgb *= vColor.rgb;
  63. #endif
  64. // Bump
  65. #ifdef NORMAL
  66. vec3 normalW = normalize(vNormalW);
  67. vec2 perturbation = bumpHeight * (baseColor.rg - 0.5);
  68. #else
  69. vec3 normalW = vec3(1.0, 1.0, 1.0);
  70. vec2 perturbation = bumpHeight * (vec2(1.0, 1.0) - 0.5);
  71. #endif
  72. #ifdef REFLECTION
  73. // Water
  74. vec3 eyeVector = normalize(vEyePosition - vPosition);
  75. vec2 projectedRefractionTexCoords = clamp(vRefractionMapTexCoord.xy / vRefractionMapTexCoord.z + perturbation, 0.0, 1.0);
  76. vec4 refractiveColor = texture2D(refractionSampler, projectedRefractionTexCoords);
  77. vec2 projectedReflectionTexCoords = clamp(vReflectionMapTexCoord.xy / vReflectionMapTexCoord.z + perturbation, 0.0, 1.0);
  78. vec4 reflectiveColor = texture2D(reflectionSampler, projectedReflectionTexCoords);
  79. vec3 upVector = vec3(0.0, 1.0, 0.0);
  80. float fresnelTerm = max(dot(eyeVector, upVector), 0.0);
  81. vec4 combinedColor = refractiveColor * fresnelTerm + reflectiveColor * (1.0 - fresnelTerm);
  82. baseColor = colorBlendFactor * waterColor + (1.0 - colorBlendFactor) * combinedColor;
  83. #endif
  84. // Lighting
  85. vec3 diffuseBase = vec3(0., 0., 0.);
  86. lightingInfo info;
  87. float shadow = 1.;
  88. #ifdef SPECULARTERM
  89. float glossiness = vSpecularColor.a;
  90. vec3 specularBase = vec3(0., 0., 0.);
  91. vec3 specularColor = vSpecularColor.rgb;
  92. #else
  93. float glossiness = 0.;
  94. #endif
  95. #include<lightFragment>[0..maxSimultaneousLights]
  96. #ifdef VERTEXALPHA
  97. alpha *= vColor.a;
  98. #endif
  99. #ifdef SPECULARTERM
  100. vec3 finalSpecular = specularBase * specularColor;
  101. #else
  102. vec3 finalSpecular = vec3(0.0);
  103. #endif
  104. vec3 finalDiffuse = clamp(diffuseBase * diffuseColor, 0.0, 1.0) * baseColor.rgb;
  105. // Composition
  106. vec4 color = vec4(finalDiffuse + finalSpecular, alpha);
  107. #include<fogFragment>
  108. gl_FragColor = color;
  109. }