water-lighting-model-fsh.glsl 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #define PHONG
  2. uniform vec3 diffuse;
  3. uniform vec3 emissive;
  4. uniform vec3 specular;
  5. uniform float shininess;
  6. uniform float opacity;
  7. #include <common>
  8. #include <packing>
  9. #include <dithering_pars_fragment>
  10. #include <color_pars_fragment>
  11. #include <uv_pars_fragment>
  12. #include <map_pars_fragment>
  13. #include <alphamap_pars_fragment>
  14. #include <alphatest_pars_fragment>
  15. #include <alphahash_pars_fragment>
  16. #include <aomap_pars_fragment>
  17. #include <lightmap_pars_fragment>
  18. #include <emissivemap_pars_fragment>
  19. #include <envmap_common_pars_fragment>
  20. #include <envmap_pars_fragment>
  21. #include <fog_pars_fragment>
  22. #include <bsdfs>
  23. #include <lights_pars_begin>
  24. #include <normal_pars_fragment>
  25. #include <lights_phong_pars_fragment>
  26. #include <shadowmap_pars_fragment>
  27. #include <bumpmap_pars_fragment>
  28. #include <normalmap_pars_fragment>
  29. #include <specularmap_pars_fragment>
  30. #include <logdepthbuf_pars_fragment>
  31. #include <clipping_planes_pars_fragment>
  32. uniform mat4 projectionMatrix;
  33. uniform mat4 inverseProjectionMatrix;
  34. uniform sampler2D colourTexture;
  35. uniform vec2 resolution;
  36. uniform float time;
  37. varying vec3 vWorldNormal;
  38. varying vec3 vWorldPos;
  39. vec2 ViewToScreen(vec3 pos) {
  40. vec4 clipPos = projectionMatrix * vec4(pos, 1.0);
  41. vec3 ndcPos = clipPos.xyz / clipPos.w;
  42. return ndcPos.xy * 0.5 + 0.5;
  43. }
  44. vec3 ScreenToView(vec2 uv) {
  45. vec2 ndcPos = uv * 2.0 - 1.0;
  46. vec4 clipPos = vec4(ndcPos, 0.0, 1.0);
  47. vec4 viewPos = inverse(projectionMatrix) * clipPos;
  48. return vec3(viewPos.xy / viewPos.w, 1.0);
  49. }
  50. // TODO: This was lazily done to just get it working.
  51. // Do not use this for anything other than this demo.
  52. vec4 TraceRay(vec3 rayWorldOrigin, vec3 rayWorldDir) {
  53. const int MAX_COUNT = 32;
  54. vec3 rayViewPos = (viewMatrix * vec4(rayWorldOrigin, 1.0)).xyz;
  55. vec3 rayViewDir = (viewMatrix * vec4(rayWorldDir, 0.0)).xyz;
  56. vec3 rayPos = rayViewPos;
  57. vec3 rayDir = rayViewDir;
  58. float dist = 0.01;
  59. for (int i = 0; i < MAX_COUNT; i++) {
  60. rayPos += rayDir * dist;
  61. dist *= 1.5;
  62. vec2 coords = ViewToScreen(rayPos);
  63. float depthAtCoord = texture(colourTexture, coords).w;
  64. float rayDepth = -rayPos.z;
  65. if (depthAtCoord < rayDepth) {
  66. if (depthAtCoord < -rayViewPos.z) {
  67. continue;
  68. }
  69. if (coords.y < 0.0 || coords.y > 1.0) {
  70. break;
  71. }
  72. return vec4(texture(colourTexture, coords).xyz, 1.0);
  73. }
  74. }
  75. return vec4(0.0);
  76. }
  77. vec3 WaterNormal2(vec3 pos, float falloff) {
  78. vec3 noiseNormal = FBM_D_1_4(vec3(pos.xz * 0.4, time * 0.8), 1).yzw;
  79. return normalize(vec3(0.0, 1.0, 0.0) + noiseNormal * 0.5 * falloff);
  80. }
  81. void main() {
  82. #include <clipping_planes_fragment>
  83. vec4 diffuseColor = vec4( diffuse, opacity );
  84. ReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );
  85. vec3 totalEmissiveRadiance = emissive;
  86. #include <logdepthbuf_fragment>
  87. #include <map_fragment>
  88. #include <color_fragment>
  89. #include <alphamap_fragment>
  90. #include <alphatest_fragment>
  91. #include <alphahash_fragment>
  92. #include <specularmap_fragment>
  93. #include <normal_fragment_begin>
  94. #include <normal_fragment_maps>
  95. #include <emissivemap_fragment>
  96. #include <lights_phong_fragment>
  97. #include <lights_fragment_begin>
  98. #include <lights_fragment_maps>
  99. #include <lights_fragment_end>
  100. #include <aomap_fragment>
  101. vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;
  102. vec2 coords = gl_FragCoord.xy / resolution;
  103. float sceneZ = texture(colourTexture, coords).w;
  104. float waterZ = vViewPosition.z;
  105. float waterDepth = sceneZ - waterZ;
  106. float waterFalloff = smoothstep(0.0, 2.0, waterDepth);
  107. float dist = distance(cameraPosition, vWorldPos);
  108. vec3 viewDir = normalize(cameraPosition - vWorldPos);
  109. // vec3 waterNormal = WaterNormal(vWorldPos, sceneZ);
  110. float waterNormalFalloff = pow(saturate(dot(vec3(0.0, 1.0, 0.0), viewDir)), 2.0);// * easeIn(linearstep(100.0, 0.0, dist), 3.0);
  111. vec3 waterNormal = WaterNormal2(vWorldPos, waterNormalFalloff);
  112. float fresnel = pow(saturate(dot(waterNormal, viewDir)), 1.0);
  113. vec3 reflectedDir = reflect(-viewDir, waterNormal);
  114. vec3 refractDir = refract(-viewDir, waterNormal, 1.0 / 1.33);
  115. vec4 tracedReflection = TraceRay(vWorldPos, reflectedDir);
  116. vec3 tracedSky = CalculateSkyLighting(reflectedDir, viewDir);
  117. float edgeFalloff = smoothstep(0.5, 0.3, abs(coords.x - 0.5));
  118. edgeFalloff = remap(edgeFalloff, 0.0, 1.0, 0.25, 1.0);
  119. vec3 reflectedColour = mix(tracedSky, tracedReflection.xyz, tracedReflection.w * edgeFalloff);
  120. vec4 colourSample = texture(colourTexture, coords + noise23(vec3(vWorldPos.xz, time)) * 0.05 * waterNormalFalloff);
  121. // vec4 tracedRefraction = TraceRay(vWorldPos, refractDir);
  122. vec3 waterColour = mix(colourSample.xyz, vec3(0.2, 0.2, 0.5), waterFalloff);
  123. vec4 froth = vec4(vec3(1.0), remap(noise13(vec3(vWorldPos.xz * 10.0, time * 2.0)), -1.0, 1.0, 0.0, 1.0)) * smoothstep(0.25, 0.0, waterDepth);
  124. waterColour = mix(waterColour, froth.xyz, froth.w);
  125. outgoingLight = mix(reflectedColour, waterColour, fresnel);
  126. outgoingLight = mix(colourSample.xyz, outgoingLight, smoothstep(0.0, 0.1, waterDepth));
  127. #include <envmap_fragment>
  128. #include <opaque_fragment>
  129. #include <tonemapping_fragment>
  130. #include <colorspace_fragment>
  131. #include <fog_fragment>
  132. #include <premultiplied_alpha_fragment>
  133. #include <dithering_fragment>
  134. }