Guest User

Ocean / Water Shader Code

a guest
Jul 12th, 2024
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OpenGL Shading 3.49 KB | Source Code | 0 0
  1. shader_type spatial;
  2. render_mode depth_draw_always, diffuse_burley, cull_back, blend_mix, ensure_correct_normals, vertex_lighting;
  3.  
  4. uniform sampler2D DEPTH_TEXTURE: hint_depth_texture;
  5.  
  6. group_uniforms Color;
  7. uniform vec3 albedo1: source_color;
  8. uniform float metallic: hint_range(0.0, 1.0, 0.01) = 1.0;
  9. uniform float specular: hint_range(0.0, 1.0, 0.01) = 1.0;
  10. uniform float roughness: hint_range(0.0, 1.0, 0.01) = 1.0;
  11.  
  12. group_uniforms Textures;
  13. uniform sampler2D wave_strength_mask: hint_default_white, repeat_disable;
  14. uniform sampler2D wave_noise_one;
  15. uniform sampler2D wave_noise_one_normal_map: filter_linear_mipmap, hint_normal, repeat_enable;
  16. uniform sampler2D wave_noise_two;
  17. uniform sampler2D wave_noise_two_normal_map: filter_linear_mipmap, hint_normal, repeat_enable;
  18.  
  19. group_uniforms Uv;
  20. uniform float uv_scale;
  21. uniform float world_size;
  22. uniform float terrain_height;
  23.  
  24. group_uniforms WaveParams;
  25. uniform float wave_speed = 0.01;
  26. uniform float wave_height = 10.0;
  27. uniform vec2 foam_range = vec2(1.3,0.6);
  28. uniform vec2 wave_depth_strength_range = vec2(150,200);
  29.  
  30. varying vec2 world_pos;
  31. varying vec2 world_pos_two;
  32. varying float water_depth;
  33. varying float dist;
  34.  
  35. void vertex() {
  36.     world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xz;
  37.     vec2 og_world_pos = world_pos;
  38.     world_pos_two = world_pos;
  39.  
  40.     vec2 world_camera = INV_VIEW_MATRIX[3].xz;
  41.     dist = distance(og_world_pos, world_camera);
  42.    
  43.     float time_dilated = TIME * wave_speed;
  44.    
  45.     world_pos += time_dilated;
  46.     world_pos *= uv_scale;
  47.  
  48.     world_pos_two -= time_dilated*0.25;
  49.     world_pos_two *= uv_scale;
  50.  
  51.     float height_val = textureLod(wave_noise_one, world_pos, 0.0).r;
  52.     height_val = mix(height_val, textureLod(wave_noise_two, world_pos_two, 0.0).r, 0.5);
  53.  
  54.     height_val = height_val * 2.0 - 1.0;
  55.     height_val *= wave_height;
  56.  
  57.     water_depth = textureLod(wave_strength_mask, (og_world_pos / world_size) + 0.5, 0.0).r*terrain_height;
  58.     water_depth = abs(1.0 - pow(smoothstep(wave_depth_strength_range.x, wave_depth_strength_range.y, water_depth),0.05));
  59.     height_val *= clamp(water_depth, 0.15, 1.0);
  60.  
  61.     VERTEX.y += height_val;
  62. }
  63.  
  64. void fragment() {
  65.     //BASIC CONSTANTS//////////
  66.     ALBEDO = albedo1;
  67.     METALLIC = metallic;
  68.     SPECULAR = specular;
  69.     ROUGHNESS = roughness;
  70.     ///////////////////////////
  71.  
  72.     //FOAM
  73.     float height_val_two = textureLod(wave_noise_one, world_pos, 0.0).r;
  74.     height_val_two = mix(height_val_two, textureLod(wave_noise_two, world_pos_two, 0.0).r, 0.5);
  75.  
  76.     height_val_two = height_val_two * 2.0 - 1.0;
  77.     height_val_two *= wave_height;
  78.  
  79.     height_val_two *= clamp(water_depth, 0.15, 1.0);
  80.    
  81.     float dist_mask = clamp(abs(pow(smoothstep(350.0, 1000.0,dist),0.25)), 0.0,0.75);
  82.    
  83.     ALBEDO = mix(mix(vec3(1.0),ALBEDO,smoothstep(foam_range.x,foam_range.y,height_val_two)), ALBEDO, dist_mask);
  84.  
  85.     //DEPTH STUFF - OBJECT FOAM, UNDERWATER DARKNESS//////////
  86.     float depth = texture(DEPTH_TEXTURE, SCREEN_UV).r;
  87.     depth = PROJECTION_MATRIX[3][2] / (depth + PROJECTION_MATRIX[2][2]);
  88.     depth = VERTEX.z+depth;
  89.    
  90.     //OBJECT FOAM
  91.     ALBEDO = mix(vec3(1.0),ALBEDO,smoothstep(0.25,0.5, depth));
  92.    
  93.     depth *= 0.0002;
  94.     depth = smoothstep(0.0003,0.00035,depth);
  95.     depth = pow(1.8, depth);
  96.    
  97.     ALBEDO *= vec3(depth);
  98.     //////////////////////////////////////////////////////////
  99.  
  100.     //WATER NORMALS
  101.     vec3 normal = texture(wave_noise_one_normal_map, world_pos).xyz;
  102.     normal = mix(normal, texture(wave_noise_two_normal_map, world_pos_two).xyz, 0.5);
  103.    
  104.     NORMAL_MAP = normal;
  105.     NORMAL_MAP_DEPTH = 1.0;
  106.    
  107.     NORMAL_MAP_DEPTH *= clamp(water_depth, 0.15, 1.0);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment