water.fragment.fx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #ifdef LOGARITHMICDEPTH
  2. #extension GL_EXT_frag_depth : enable
  3. #endif
  4. precision highp float;
  5. // Constants
  6. uniform vec4 vEyePosition;
  7. uniform vec4 vDiffuseColor;
  8. #ifdef SPECULARTERM
  9. uniform vec4 vSpecularColor;
  10. #endif
  11. // Input
  12. varying vec3 vPositionW;
  13. #ifdef NORMAL
  14. varying vec3 vNormalW;
  15. #endif
  16. #ifdef VERTEXCOLOR
  17. varying vec4 vColor;
  18. #endif
  19. // Helper functions
  20. #include<helperFunctions>
  21. #include<imageProcessingDeclaration>
  22. #include<imageProcessingFunctions>
  23. // Lights
  24. #include<__decl__lightFragment>[0..maxSimultaneousLights]
  25. #include<lightsFragmentFunctions>
  26. #include<shadowsFragmentFunctions>
  27. // Samplers
  28. #ifdef BUMP
  29. varying vec2 vNormalUV;
  30. #ifdef BUMPSUPERIMPOSE
  31. varying vec2 vNormalUV2;
  32. #endif
  33. uniform sampler2D normalSampler;
  34. uniform vec2 vNormalInfos;
  35. #endif
  36. uniform sampler2D refractionSampler;
  37. uniform sampler2D reflectionSampler;
  38. // Water uniforms
  39. const float LOG2 = 1.442695;
  40. uniform vec3 cameraPosition;
  41. uniform vec4 waterColor;
  42. uniform float colorBlendFactor;
  43. uniform vec4 waterColor2;
  44. uniform float colorBlendFactor2;
  45. uniform float bumpHeight;
  46. uniform float time;
  47. // Water varyings
  48. varying vec3 vRefractionMapTexCoord;
  49. varying vec3 vReflectionMapTexCoord;
  50. varying vec3 vPosition;
  51. #include<clipPlaneFragmentDeclaration>
  52. #include<logDepthDeclaration>
  53. // Fog
  54. #include<fogFragmentDeclaration>
  55. void main(void) {
  56. // Clip plane
  57. #include<clipPlaneFragment>
  58. vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
  59. // Base color
  60. vec4 baseColor = vec4(1., 1., 1., 1.);
  61. vec3 diffuseColor = vDiffuseColor.rgb;
  62. // Alpha
  63. float alpha = vDiffuseColor.a;
  64. #ifdef BUMP
  65. #ifdef BUMPSUPERIMPOSE
  66. baseColor = 0.6 * texture2D(normalSampler, vNormalUV) + 0.4 * texture2D(normalSampler,vec2(vNormalUV2.x,vNormalUV2.y));
  67. #else
  68. baseColor = texture2D(normalSampler, vNormalUV);
  69. #endif
  70. vec3 bumpColor = baseColor.rgb;
  71. #ifdef ALPHATEST
  72. if (baseColor.a < 0.4)
  73. discard;
  74. #endif
  75. baseColor.rgb *= vNormalInfos.y;
  76. #else
  77. vec3 bumpColor = vec3(1.0);
  78. #endif
  79. #ifdef VERTEXCOLOR
  80. baseColor.rgb *= vColor.rgb;
  81. #endif
  82. // Bump
  83. #ifdef NORMAL
  84. vec2 perturbation = bumpHeight * (baseColor.rg - 0.5);
  85. #ifdef BUMPAFFECTSREFLECTION
  86. vec3 normalW = normalize(vNormalW + vec3(perturbation.x*8.0,0.0,perturbation.y*8.0));
  87. if (normalW.y<0.0) {
  88. normalW.y = -normalW.y;
  89. }
  90. #else
  91. vec3 normalW = normalize(vNormalW);
  92. #endif
  93. #else
  94. vec3 normalW = vec3(1.0, 1.0, 1.0);
  95. vec2 perturbation = bumpHeight * (vec2(1.0, 1.0) - 0.5);
  96. #endif
  97. #ifdef FRESNELSEPARATE
  98. #ifdef REFLECTION
  99. // Water
  100. vec2 projectedRefractionTexCoords = clamp(vRefractionMapTexCoord.xy / vRefractionMapTexCoord.z + perturbation*0.5, 0.0, 1.0);
  101. vec4 refractiveColor = texture2D(refractionSampler, projectedRefractionTexCoords);
  102. #ifdef IS_REFRACTION_LINEAR
  103. refractiveColor.rgb = toGammaSpace(refractiveColor.rgb);
  104. #endif
  105. vec2 projectedReflectionTexCoords = clamp(vec2(
  106. vReflectionMapTexCoord.x / vReflectionMapTexCoord.z + perturbation.x * 0.3,
  107. vReflectionMapTexCoord.y / vReflectionMapTexCoord.z + perturbation.y
  108. ),0.0, 1.0);
  109. vec4 reflectiveColor = texture2D(reflectionSampler, projectedReflectionTexCoords);
  110. #ifdef IS_REFLECTION_LINEAR
  111. reflectiveColor.rgb = toGammaSpace(reflectiveColor.rgb);
  112. #endif
  113. vec3 upVector = vec3(0.0, 1.0, 0.0);
  114. float fresnelTerm = clamp(abs(pow(dot(viewDirectionW, upVector),3.0)),0.05,0.65);
  115. float IfresnelTerm = 1.0 - fresnelTerm;
  116. refractiveColor = colorBlendFactor*waterColor + (1.0-colorBlendFactor)*refractiveColor;
  117. reflectiveColor = IfresnelTerm*colorBlendFactor2*waterColor + (1.0-colorBlendFactor2*IfresnelTerm)*reflectiveColor;
  118. vec4 combinedColor = refractiveColor * fresnelTerm + reflectiveColor * IfresnelTerm;
  119. baseColor = combinedColor;
  120. #endif
  121. // Lighting
  122. vec3 diffuseBase = vec3(0., 0., 0.);
  123. lightingInfo info;
  124. float shadow = 1.;
  125. #ifdef SPECULARTERM
  126. float glossiness = vSpecularColor.a;
  127. vec3 specularBase = vec3(0., 0., 0.);
  128. vec3 specularColor = vSpecularColor.rgb;
  129. #else
  130. float glossiness = 0.;
  131. #endif
  132. #include<lightFragment>[0..maxSimultaneousLights]
  133. vec3 finalDiffuse = clamp(baseColor.rgb, 0.0, 1.0);
  134. #ifdef VERTEXALPHA
  135. alpha *= vColor.a;
  136. #endif
  137. #ifdef SPECULARTERM
  138. vec3 finalSpecular = specularBase * specularColor;
  139. #else
  140. vec3 finalSpecular = vec3(0.0);
  141. #endif
  142. #else // !FRESNELSEPARATE
  143. #ifdef REFLECTION
  144. // Water
  145. vec2 projectedRefractionTexCoords = clamp(vRefractionMapTexCoord.xy / vRefractionMapTexCoord.z + perturbation, 0.0, 1.0);
  146. vec4 refractiveColor = texture2D(refractionSampler, projectedRefractionTexCoords);
  147. #ifdef IS_REFRACTION_LINEAR
  148. refractiveColor.rgb = toGammaSpace(refractiveColor.rgb);
  149. #endif
  150. vec2 projectedReflectionTexCoords = clamp(vReflectionMapTexCoord.xy / vReflectionMapTexCoord.z + perturbation, 0.0, 1.0);
  151. vec4 reflectiveColor = texture2D(reflectionSampler, projectedReflectionTexCoords);
  152. #ifdef IS_REFLECTION_LINEAR
  153. reflectiveColor.rgb = toGammaSpace(reflectiveColor.rgb);
  154. #endif
  155. vec3 upVector = vec3(0.0, 1.0, 0.0);
  156. float fresnelTerm = max(dot(viewDirectionW, upVector), 0.0);
  157. vec4 combinedColor = refractiveColor * fresnelTerm + reflectiveColor * (1.0 - fresnelTerm);
  158. baseColor = colorBlendFactor * waterColor + (1.0 - colorBlendFactor) * combinedColor;
  159. #endif
  160. // Lighting
  161. vec3 diffuseBase = vec3(0., 0., 0.);
  162. lightingInfo info;
  163. float shadow = 1.;
  164. #ifdef SPECULARTERM
  165. float glossiness = vSpecularColor.a;
  166. vec3 specularBase = vec3(0., 0., 0.);
  167. vec3 specularColor = vSpecularColor.rgb;
  168. #else
  169. float glossiness = 0.;
  170. #endif
  171. #include<lightFragment>[0..maxSimultaneousLights]
  172. vec3 finalDiffuse = clamp(baseColor.rgb, 0.0, 1.0);
  173. #ifdef VERTEXALPHA
  174. alpha *= vColor.a;
  175. #endif
  176. #ifdef SPECULARTERM
  177. vec3 finalSpecular = specularBase * specularColor;
  178. #else
  179. vec3 finalSpecular = vec3(0.0);
  180. #endif
  181. #endif
  182. // Composition
  183. vec4 color = vec4(finalDiffuse + finalSpecular, alpha);
  184. #include<logDepthFragment>
  185. #include<fogFragment>
  186. // Apply image processing if relevant. As this applies in linear space,
  187. // We first move from gamma to linear.
  188. #ifdef IMAGEPROCESSINGPOSTPROCESS
  189. color.rgb = toLinearSpace(color.rgb);
  190. #elif defined(IMAGEPROCESSING)
  191. color.rgb = toLinearSpace(color.rgb);
  192. color = applyImageProcessing(color);
  193. #endif
  194. gl_FragColor = color;
  195. }