Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- shader_type spatial;
- render_mode depth_draw_always, diffuse_burley, cull_back, blend_mix, ensure_correct_normals, vertex_lighting;
- uniform sampler2D DEPTH_TEXTURE: hint_depth_texture;
- group_uniforms Color;
- uniform vec3 albedo1: source_color;
- uniform float metallic: hint_range(0.0, 1.0, 0.01) = 1.0;
- uniform float specular: hint_range(0.0, 1.0, 0.01) = 1.0;
- uniform float roughness: hint_range(0.0, 1.0, 0.01) = 1.0;
- group_uniforms Textures;
- uniform sampler2D wave_strength_mask: hint_default_white, repeat_disable;
- uniform sampler2D wave_noise_one;
- uniform sampler2D wave_noise_one_normal_map: filter_linear_mipmap, hint_normal, repeat_enable;
- uniform sampler2D wave_noise_two;
- uniform sampler2D wave_noise_two_normal_map: filter_linear_mipmap, hint_normal, repeat_enable;
- group_uniforms Uv;
- uniform float uv_scale;
- uniform float world_size;
- uniform float terrain_height;
- group_uniforms WaveParams;
- uniform float wave_speed = 0.01;
- uniform float wave_height = 10.0;
- uniform vec2 foam_range = vec2(1.3,0.6);
- uniform vec2 wave_depth_strength_range = vec2(150,200);
- varying vec2 world_pos;
- varying vec2 world_pos_two;
- varying float water_depth;
- varying float dist;
- void vertex() {
- world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xz;
- vec2 og_world_pos = world_pos;
- world_pos_two = world_pos;
- vec2 world_camera = INV_VIEW_MATRIX[3].xz;
- dist = distance(og_world_pos, world_camera);
- float time_dilated = TIME * wave_speed;
- world_pos += time_dilated;
- world_pos *= uv_scale;
- world_pos_two -= time_dilated*0.25;
- world_pos_two *= uv_scale;
- float height_val = textureLod(wave_noise_one, world_pos, 0.0).r;
- height_val = mix(height_val, textureLod(wave_noise_two, world_pos_two, 0.0).r, 0.5);
- height_val = height_val * 2.0 - 1.0;
- height_val *= wave_height;
- water_depth = textureLod(wave_strength_mask, (og_world_pos / world_size) + 0.5, 0.0).r*terrain_height;
- water_depth = abs(1.0 - pow(smoothstep(wave_depth_strength_range.x, wave_depth_strength_range.y, water_depth),0.05));
- height_val *= clamp(water_depth, 0.15, 1.0);
- VERTEX.y += height_val;
- }
- void fragment() {
- //BASIC CONSTANTS//////////
- ALBEDO = albedo1;
- METALLIC = metallic;
- SPECULAR = specular;
- ROUGHNESS = roughness;
- ///////////////////////////
- //FOAM
- float height_val_two = textureLod(wave_noise_one, world_pos, 0.0).r;
- height_val_two = mix(height_val_two, textureLod(wave_noise_two, world_pos_two, 0.0).r, 0.5);
- height_val_two = height_val_two * 2.0 - 1.0;
- height_val_two *= wave_height;
- height_val_two *= clamp(water_depth, 0.15, 1.0);
- float dist_mask = clamp(abs(pow(smoothstep(350.0, 1000.0,dist),0.25)), 0.0,0.75);
- ALBEDO = mix(mix(vec3(1.0),ALBEDO,smoothstep(foam_range.x,foam_range.y,height_val_two)), ALBEDO, dist_mask);
- //DEPTH STUFF - OBJECT FOAM, UNDERWATER DARKNESS//////////
- float depth = texture(DEPTH_TEXTURE, SCREEN_UV).r;
- depth = PROJECTION_MATRIX[3][2] / (depth + PROJECTION_MATRIX[2][2]);
- depth = VERTEX.z+depth;
- //OBJECT FOAM
- ALBEDO = mix(vec3(1.0),ALBEDO,smoothstep(0.25,0.5, depth));
- depth *= 0.0002;
- depth = smoothstep(0.0003,0.00035,depth);
- depth = pow(1.8, depth);
- ALBEDO *= vec3(depth);
- //////////////////////////////////////////////////////////
- //WATER NORMALS
- vec3 normal = texture(wave_noise_one_normal_map, world_pos).xyz;
- normal = mix(normal, texture(wave_noise_two_normal_map, world_pos_two).xyz, 0.5);
- NORMAL_MAP = normal;
- NORMAL_MAP_DEPTH = 1.0;
- NORMAL_MAP_DEPTH *= clamp(water_depth, 0.15, 1.0);
- }
Advertisement
Add Comment
Please, Sign In to add comment