water.glslf 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. #version GLSL_VERSION
  2. /*==============================================================================
  3. VARS
  4. ==============================================================================*/
  5. #var PRECISION highp
  6. #var USE_FOG 0
  7. #var USE_TBN_SHADING 0
  8. #var NORM_FOAM0 0
  9. #var NORM_FOAM1 0
  10. #var NORM_FOAM2 0
  11. #var NORM_FOAM3 0
  12. #var DEBUG_WIREFRAME 0
  13. #var NUM_NORMALMAPS 0
  14. #var FOAM 0
  15. #var SHORE_PARAMS 0
  16. #var GENERATED_MESH 0
  17. #var ABSORB 6.0
  18. #var SSS_STRENGTH 1.0
  19. #var SSS_WIDTH 0.45
  20. #var ALPHA 0
  21. #var DISABLE_FOG 0
  22. #var NUM_LIGHTS 0
  23. #var WAVES_HEIGHT 1.0
  24. #var WATER_LEVEL 0.0
  25. #var PROCEDURAL_FOG 0
  26. #var SKY_TEXTURE 0
  27. #var USE_REFRACTION_CORRECTION 0
  28. #var SHORE_SMOOTHING 0
  29. #var DYNAMIC 0
  30. #var USE_ENVIRONMENT_LIGHT 0
  31. #var SKY_COLOR 0
  32. #var REFLECTION_TYPE REFL_NONE
  33. #var WATER_EFFECTS 0
  34. #var REFRACTIVE 0
  35. /*==============================================================================
  36. INCLUDES
  37. ==============================================================================*/
  38. #include <precision_statement.glslf>
  39. #include <std.glsl>
  40. #include <pack.glslf>
  41. #include <color_util.glslf>
  42. #include <math.glslv>
  43. #define REFL_BUMP 0.002 //How much normal affects reflection displacement
  44. /*==============================================================================
  45. GLOBAL UNIFORMS
  46. ==============================================================================*/
  47. uniform float u_time;
  48. #if USE_ENVIRONMENT_LIGHT && SKY_TEXTURE
  49. uniform samplerCube u_sky_texture;
  50. #elif USE_ENVIRONMENT_LIGHT && SKY_COLOR
  51. uniform vec3 u_horizon_color;
  52. uniform vec3 u_zenith_color;
  53. #endif
  54. uniform float u_environment_energy;
  55. #if NUM_LIGHTS > 0
  56. // light_factors packed in the w componnets
  57. uniform vec4 u_light_positions[NUM_LIGHTS];
  58. uniform vec3 u_light_directions[NUM_LIGHTS];
  59. uniform vec4 u_light_color_intensities[NUM_LIGHTS];
  60. #endif
  61. uniform vec3 u_sun_intensity;
  62. uniform vec3 u_sun_direction;
  63. #if REFLECTION_TYPE == REFL_PLANE || SHORE_SMOOTHING || (WATER_EFFECTS && !DISABLE_FOG)
  64. uniform float u_cam_water_depth;
  65. #endif
  66. #if !DISABLE_FOG
  67. uniform vec4 u_fog_color_density;
  68. # if WATER_EFFECTS
  69. uniform vec4 u_underwater_fog_color_density;
  70. # endif
  71. # if PROCEDURAL_FOG
  72. uniform mat4 u_cube_fog;
  73. # endif
  74. # if USE_FOG
  75. uniform vec4 u_fog_params; // intensity, depth, start, height
  76. # endif
  77. #endif
  78. /*==============================================================================
  79. SAMPLER UNIFORMS
  80. ==============================================================================*/
  81. #if NUM_NORMALMAPS > 0
  82. uniform sampler2D u_normalmap0;
  83. #endif
  84. #if REFRACTIVE
  85. uniform sampler2D u_refractmap;
  86. #endif
  87. #if REFLECTION_TYPE == REFL_PLANE
  88. uniform sampler2D u_plane_reflection;
  89. #elif REFLECTION_TYPE == REFL_MIRRORMAP
  90. uniform samplerCube u_mirrormap;
  91. #endif
  92. #if SHORE_SMOOTHING
  93. uniform PRECISION sampler2D u_scene_depth;
  94. #endif
  95. #if FOAM
  96. uniform sampler2D u_foam;
  97. #endif
  98. /*==============================================================================
  99. MATERIAL UNIFORMS
  100. ==============================================================================*/
  101. uniform vec4 u_diffuse_color; // water color and alpha
  102. uniform vec2 u_diffuse_params;
  103. uniform float u_diffuse_intensity;
  104. uniform float u_ambient;
  105. uniform vec4 u_fresnel_params;
  106. uniform vec3 u_specular_color;
  107. uniform vec3 u_specular_params;
  108. uniform vec3 u_shallow_water_col;
  109. uniform vec3 u_shore_water_col;
  110. #if NUM_NORMALMAPS > 0
  111. uniform float u_water_norm_uv_velocity;
  112. uniform vec2 u_normalmap0_scale;
  113. # if NUM_NORMALMAPS > 1
  114. uniform vec2 u_normalmap1_scale;
  115. # if NUM_NORMALMAPS > 2
  116. uniform vec2 u_normalmap2_scale;
  117. # if NUM_NORMALMAPS > 3
  118. uniform vec2 u_normalmap3_scale;
  119. # endif
  120. # endif
  121. # endif
  122. #endif
  123. #if REFLECTION_TYPE == REFL_MIRRORMAP
  124. uniform float u_mirror_factor;
  125. #else
  126. uniform float u_reflect_factor;
  127. #endif
  128. #if SHORE_SMOOTHING || !DISABLE_FOG
  129. uniform float u_view_max_depth;
  130. #endif
  131. #if SHORE_PARAMS
  132. uniform float u_water_shallow_col_fac;
  133. uniform float u_water_shore_col_fac;
  134. #endif
  135. #if FOAM
  136. uniform float u_foam_factor;
  137. uniform vec2 u_foam_uv_freq;
  138. uniform vec2 u_foam_mag;
  139. uniform vec2 u_foam_scale;
  140. #endif
  141. #if REFRACTIVE
  142. uniform float u_refr_bump;
  143. #endif
  144. #if DEBUG_WIREFRAME
  145. const float WIREFRAME_WIDTH = 1.0;
  146. uniform vec3 u_wireframe_edge_color;
  147. #endif
  148. /*==============================================================================
  149. SHADER INTERFACE
  150. ==============================================================================*/
  151. GLSL_IN vec3 v_eye_dir;
  152. GLSL_IN vec3 v_pos_world;
  153. GLSL_IN vec3 v_normal;
  154. #if (NUM_NORMALMAPS > 0 || FOAM) && !GENERATED_MESH
  155. GLSL_IN vec2 v_texcoord;
  156. #endif
  157. #if NUM_NORMALMAPS > 0
  158. GLSL_IN vec3 v_tangent;
  159. GLSL_IN vec3 v_binormal;
  160. #endif
  161. #if (NUM_NORMALMAPS > 0 || FOAM) && GENERATED_MESH && DYNAMIC
  162. GLSL_IN vec3 v_calm_pos_world;
  163. # endif
  164. #if SHORE_PARAMS
  165. GLSL_IN vec3 v_shore_params;
  166. #endif
  167. #if SHORE_SMOOTHING || REFLECTION_TYPE == REFL_PLANE || REFRACTIVE
  168. GLSL_IN vec3 v_tex_pos_clip;
  169. #endif
  170. #if SHORE_SMOOTHING || REFLECTION_TYPE == REFL_PLANE || REFRACTIVE || !DISABLE_FOG
  171. GLSL_IN float v_view_depth;
  172. #endif
  173. #if DEBUG_WIREFRAME
  174. GLSL_IN vec3 v_barycentric;
  175. #endif
  176. #if USE_TBN_SHADING
  177. GLSL_IN vec3 v_shade_tang;
  178. #endif
  179. //------------------------------------------------------------------------------
  180. GLSL_OUT vec4 GLSL_OUT_FRAG_COLOR;
  181. /*==============================================================================
  182. FUNCTIONS
  183. ==============================================================================*/
  184. #include <environment.glslf>
  185. #if REFRACTIVE && SHORE_SMOOTHING && USE_REFRACTION_CORRECTION
  186. #include <refraction.glslf>
  187. #endif
  188. #if !DISABLE_FOG
  189. #include <fog.glslf>
  190. #endif
  191. vec3 reflection (in vec2 screen_coord, in vec3 normal, in vec3 eye_dir,
  192. in vec3 light_energies, out float mirror_factor) {
  193. // NOTE: set up out variables to prevent IE 11 linking crash
  194. mirror_factor = 0.0;
  195. vec3 eye_reflected = reflect(-eye_dir, normal);
  196. #if REFLECTION_TYPE == REFL_PLANE
  197. vec2 reflect_coord = screen_coord.xy + normal.xy * REFL_BUMP
  198. / v_view_depth;
  199. mirror_factor = u_reflect_factor;
  200. vec3 reflect_color;
  201. if (u_cam_water_depth < 0.0) {
  202. # if !DISABLE_FOG && WATER_EFFECTS
  203. reflect_color = u_underwater_fog_color_density.rgb;
  204. # else
  205. reflect_color = u_diffuse_color.rgb;
  206. # endif
  207. //float eye_dot_norm = dot(eye_dir, normal);
  208. //mirror_factor *= max(1.0 - 1.0 / eye_dot_norm, 0.0);
  209. } else {
  210. reflect_color = GLSL_TEXTURE(u_plane_reflection, reflect_coord).rgb;
  211. srgb_to_lin(reflect_color);
  212. }
  213. #elif REFLECTION_TYPE == REFL_MIRRORMAP
  214. mirror_factor = u_mirror_factor;
  215. vec3 reflect_color = light_energies * GLSL_TEXTURE_CUBE(u_mirrormap, eye_reflected).rgb;
  216. srgb_to_lin(reflect_color);
  217. #else // REFLECTION_TYPE == REFL_PLANE
  218. mirror_factor = u_reflect_factor;
  219. vec3 reflect_color = light_energies * vec3(0.3,0.5,1.0);
  220. srgb_to_lin(reflect_color);
  221. #endif // REFLECTION_TYPE == REFL_PLANE
  222. // calculate mirror factor using fresnel
  223. vec3 reflected_halfway = normalize(eye_reflected + eye_dir);
  224. float one_minus_cos_theta = 1.0 - dot(eye_dir, reflected_halfway);
  225. float r0 = u_fresnel_params[3];
  226. float N = u_fresnel_params[2];
  227. float r = r0 + (1.0 - r0) * pow(one_minus_cos_theta, N);
  228. mirror_factor = min(mirror_factor * r, 1.0);
  229. return reflect_color;
  230. }
  231. /*==============================================================================
  232. INCLUDES
  233. ==============================================================================*/
  234. #include <lighting_nodes.glslf>
  235. /*==============================================================================
  236. MAIN
  237. ==============================================================================*/
  238. void main(void) {
  239. #if NUM_NORMALMAPS > 0
  240. mat3 tbn_matrix = mat3(v_tangent, v_binormal, v_normal);
  241. #endif
  242. vec3 normal = normalize(v_normal);
  243. #if DYNAMIC && FOAM
  244. # if WATER_EFFECTS
  245. float dist_to_water = v_pos_world.z - WATER_LEVEL;
  246. # else
  247. float dist_to_water = v_pos_world.z;
  248. # endif
  249. #endif
  250. #if NUM_NORMALMAPS > 0 || FOAM
  251. # if GENERATED_MESH
  252. # if DYNAMIC
  253. vec2 texcoord = vec2(v_calm_pos_world.x, -v_calm_pos_world.y) + 0.5;
  254. # else
  255. vec2 texcoord = vec2(v_pos_world.x, -v_pos_world.y) + 0.5;
  256. # endif // DYNAMIC
  257. # else
  258. vec2 texcoord = v_texcoord;
  259. # endif // GENERATED_MESH
  260. #endif
  261. #if NUM_NORMALMAPS > 0
  262. // wave motion
  263. vec3 n_sum = vec3(0.0);
  264. vec3 tex_norm = GLSL_TEXTURE(u_normalmap0, texcoord * u_normalmap0_scale
  265. + vec2(0.3, 0.5) * u_water_norm_uv_velocity * u_time).xyz - 0.5;
  266. n_sum += tex_norm;
  267. # if FOAM
  268. vec3 n_foam = vec3(0.0);
  269. # if NORM_FOAM0
  270. n_foam += tex_norm;
  271. # endif
  272. # endif
  273. #endif
  274. #if NUM_NORMALMAPS > 1
  275. tex_norm = GLSL_TEXTURE(u_normalmap0, texcoord * u_normalmap1_scale
  276. + vec2(-0.3, 0.7) * u_water_norm_uv_velocity * u_time).xyz - 0.5;
  277. n_sum += tex_norm;
  278. # if FOAM
  279. # if NORM_FOAM1
  280. n_foam += tex_norm;
  281. # endif
  282. # endif
  283. #endif
  284. #if NUM_NORMALMAPS > 2
  285. tex_norm = GLSL_TEXTURE(u_normalmap0, texcoord * u_normalmap2_scale
  286. + vec2(0.0, 1.1) * u_water_norm_uv_velocity * u_time).xyz - 0.5;
  287. n_sum += tex_norm;
  288. # if FOAM
  289. # if NORM_FOAM2
  290. n_foam += tex_norm;
  291. # endif
  292. # endif
  293. #endif
  294. #if NUM_NORMALMAPS > 3
  295. tex_norm = GLSL_TEXTURE(u_normalmap0, texcoord * u_normalmap3_scale
  296. + vec2(-0.66, -0.3) * u_water_norm_uv_velocity * u_time).xyz - 0.5;
  297. n_sum += tex_norm;
  298. # if FOAM
  299. # if NORM_FOAM3
  300. n_foam += tex_norm;
  301. # endif
  302. # endif
  303. #endif
  304. #if NUM_NORMALMAPS > 0
  305. // converting normals to tangent space
  306. # if FOAM
  307. // TODO: check directives NORM_FOAM0, ...
  308. vec3 n_foam_world_norm = tbn_matrix * n_foam;
  309. if (!is_equal3f(n_foam_world_norm, vec3(0.0)))
  310. n_foam_world_norm = normalize(n_foam_world_norm);
  311. vec3 normal_foam = mix(normal, n_foam_world_norm, 0.2);
  312. normal_foam = normalize(normal_foam);
  313. # endif
  314. # if DYNAMIC
  315. normal = mix(normal, normalize(tbn_matrix * n_sum), 0.3);
  316. # else
  317. normal = mix(normal, normalize(tbn_matrix * n_sum), 0.5);
  318. # endif
  319. normal = normalize(normal);
  320. #endif
  321. vec3 eye_dir = normalize(v_eye_dir);
  322. #if REFLECTION_TYPE == REFL_PLANE || REFRACTIVE
  323. vec2 screen_coord = v_tex_pos_clip.xy/v_tex_pos_clip.z;
  324. #endif
  325. #if REFRACTIVE
  326. vec2 refract_coord = screen_coord + normal.xy * u_refr_bump
  327. / v_view_depth;
  328. #endif
  329. #if SHORE_SMOOTHING
  330. float alpha = u_diffuse_color.a;
  331. vec4 scene_depth_rgba = GLSL_TEXTURE_PROJ(u_scene_depth, v_tex_pos_clip);
  332. float scene_depth = unpack_float(scene_depth_rgba);
  333. float delta = max(scene_depth - v_view_depth, 0.0);
  334. # if REFRACTIVE
  335. float scene_depth_refr = refraction_correction(scene_depth, refract_coord, screen_coord);
  336. float delta_refr = max(scene_depth_refr - v_view_depth, 0.0);
  337. float depth_diff_refr = u_view_max_depth / ABSORB * delta_refr;
  338. float refract_factor = min(alpha * depth_diff_refr, 1.0);
  339. // refraction stuff represents disturbed underwater surface
  340. // so leave alpha slightly transparent only close to the shore
  341. alpha = min(15.0 * alpha * u_view_max_depth * delta, 1.0);
  342. # else // REFRACTIVE
  343. float depth_diff = u_view_max_depth / ABSORB * delta;
  344. if (u_cam_water_depth > 0.0)
  345. alpha = min(alpha * depth_diff, 1.0);
  346. # endif // REFRACTIVE
  347. #else // SHORE_SMOOTHING
  348. float alpha = u_diffuse_color.a;
  349. # if REFRACTIVE
  350. float refract_factor = alpha;
  351. # endif
  352. #endif // SHORE_SMOOTHING
  353. #if REFRACTIVE
  354. if (u_cam_water_depth < 0.0)
  355. refract_factor = 0.0;
  356. vec3 refract_color = GLSL_TEXTURE(u_refractmap, refract_coord).rgb;
  357. srgb_to_lin(refract_color);
  358. #endif
  359. #if SHORE_PARAMS
  360. // shallow gradient
  361. float grad_f = pow(min(v_shore_params.b / u_water_shallow_col_fac, 1.0), 0.3);
  362. vec3 diffuse_color = mix(u_shallow_water_col, u_diffuse_color.rgb, grad_f);
  363. // shore water gradient
  364. grad_f = pow(min(v_shore_params.b / u_water_shore_col_fac, 1.0), 0.3);
  365. diffuse_color = mix(u_shore_water_col, diffuse_color, grad_f);
  366. #else
  367. vec3 diffuse_color = u_diffuse_color.rgb;
  368. #endif
  369. #if FOAM
  370. # if SHORE_SMOOTHING
  371. float foam_factor = max(1.0 - u_view_max_depth * delta, 0.0);
  372. # else
  373. float foam_factor = 1.0 - alpha;
  374. # endif // SHORE_SMOOTHING
  375. # if DYNAMIC
  376. float foam_waves_factor = max(dist_to_water / WAVES_HEIGHT + 0.1, 0.0);
  377. # if SHORE_PARAMS
  378. // add foam to directional waves
  379. vec3 dir_shore = normalize(vec3(v_shore_params.rg, 0.0));
  380. vec3 foam_dir = normalize(mix(UP_VECTOR, dir_shore, 0.8));
  381. float foam_shore_waves = 1.25*max(dot(normal_foam, foam_dir) - 0.2, 0.0);
  382. foam_shore_waves += max(dot(normal_foam, -UP_VECTOR), 0.0);
  383. foam_factor += foam_shore_waves * (1.0 - v_shore_params.b);
  384. foam_waves_factor *= (1.0 - 0.95 * pow(v_shore_params.b, 0.1));
  385. # endif // SHORE_PARAMS
  386. foam_factor += foam_waves_factor;
  387. foam_factor = min(u_foam_factor * foam_factor, 1.0);
  388. # endif // DYNAMIC
  389. vec4 foam = GLSL_TEXTURE(u_foam,
  390. u_foam_mag * sin(u_foam_uv_freq * u_time)
  391. + texcoord * u_foam_scale);
  392. #endif // FOAM
  393. // specular
  394. float specint = u_specular_params[0];
  395. vec2 spec_params = vec2(u_specular_params[1], u_specular_params[2]);
  396. vec3 S = specint * u_specular_color;
  397. // ambient
  398. vec3 environment_color = u_environment_energy * get_environment_color(normal);
  399. vec3 A = u_ambient * environment_color;
  400. vec3 light_energies = A + u_sun_intensity;
  401. float mirror_factor;
  402. #if REFLECTION_TYPE == REFL_PLANE
  403. vec3 reflect_color = reflection(screen_coord, normal, eye_dir,
  404. light_energies, mirror_factor);
  405. #else
  406. vec3 reflect_color = reflection(vec2(0.0), normal, eye_dir,
  407. light_energies, mirror_factor);
  408. #endif
  409. /*==========================================================================
  410. Apply all needed colors
  411. ==========================================================================*/
  412. vec3 D = u_diffuse_intensity * diffuse_color;
  413. vec3 color;
  414. vec3 specular;
  415. nodes_lighting(vec3(0.0), vec3(0.0), D, S, v_pos_world, normal, eye_dir,
  416. spec_params, u_diffuse_params, vec4(1.0), 0.0, vec4(0.0), color, specular);
  417. #if DYNAMIC
  418. // fake subsurface scattering (SSS)
  419. float sss_fact = max(dot(u_sun_direction, -v_normal) + SSS_WIDTH, 0.0)
  420. * max(dot(-eye_dir, u_sun_direction) - 0.5, 0.0)
  421. * max(0.0, length(u_sun_intensity) - 0.1);
  422. sss_fact = clamp(SSS_STRENGTH * sss_fact, 0.0, 1.0);
  423. color = mix(color, u_shallow_water_col, sss_fact);
  424. color = mix(color, u_shore_water_col, sss_fact);
  425. #endif
  426. #if REFRACTIVE
  427. // refraction
  428. color = mix(refract_color, color, refract_factor);
  429. #endif
  430. // reflection
  431. color = mix(color, reflect_color, mirror_factor);
  432. #if FOAM
  433. float foam_sum = mix(foam.g, foam.r, max(4.0 * (foam_factor - 0.75), 0.0));
  434. foam_sum = mix(foam.b, foam_sum, max(2.0 * foam_factor - 1.0, 0.0));
  435. foam_sum = mix(0.0, foam_sum, foam_factor);
  436. color = mix(color, light_energies, foam_sum);
  437. #endif
  438. // specular
  439. color += specular;
  440. #if WATER_EFFECTS && !DISABLE_FOG
  441. // fog stuff
  442. float surf_dist = v_view_depth * u_view_max_depth;
  443. float dist_to_water_level = 1.0;
  444. // if camera is above the water surface, use only air fog for it's surface
  445. if (u_cam_water_depth > 1.0)
  446. dist_to_water_level = 2.0;
  447. fog(color, surf_dist, eye_dir, dist_to_water_level);
  448. #endif
  449. lin_to_srgb(color);
  450. #if !REFRACTIVE
  451. // when there is no refractions make alpha stronger
  452. // in shiny areas and in areas with foam
  453. alpha = max(alpha, specular.r);
  454. #if FOAM
  455. alpha += foam_sum;
  456. #endif //FOAM
  457. #elif !SHORE_SMOOTHING
  458. alpha = 1.0;
  459. #endif //!REFRACTIVE
  460. #if ALPHA
  461. premultiply_alpha(color, alpha);
  462. #endif
  463. #if DEBUG_WIREFRAME == 1
  464. # if GLSL1
  465. #extension GL_OES_standard_derivatives: enable
  466. # endif
  467. vec3 derivatives = fwidth(v_barycentric);
  468. vec3 smoothed_bc = smoothstep(vec3(0.0), derivatives * WIREFRAME_WIDTH, v_barycentric);
  469. float edge_factor = min(min(smoothed_bc.x, smoothed_bc.y), smoothed_bc.z);
  470. edge_factor = clamp(edge_factor, 0.0, 1.0);
  471. color = mix(u_wireframe_edge_color, color, edge_factor);
  472. alpha = mix(1.0, alpha, edge_factor);
  473. #elif DEBUG_WIREFRAME == 2
  474. // extension is unsupported
  475. vec3 dist = sign(v_barycentric - vec3(0.02 * WIREFRAME_WIDTH));
  476. float edge_factor = 1.0;
  477. if (dist.x < 0.0 || dist.y < 0.0 || dist.z < 0.0)
  478. edge_factor = 0.0;
  479. color = mix(u_wireframe_edge_color, color, edge_factor);
  480. alpha = mix(1.0, alpha, edge_factor);
  481. #endif
  482. GLSL_OUT_FRAG_COLOR = vec4(color, alpha);
  483. }