Add initial stylized water shader
This commit is contained in:
parent
3dfa6b221e
commit
2458f72c17
4 changed files with 105 additions and 8 deletions
93
world/materials/stylized_water.gdshader
Normal file
93
world/materials/stylized_water.gdshader
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
shader_type spatial;
|
||||
render_mode cull_back, diffuse_burley, specular_schlick_ggx;
|
||||
|
||||
uniform vec4 deep_color : source_color = vec4(0.055, 0.31, 0.50, 1.0);
|
||||
uniform vec4 wave_color : source_color = vec4(0.18, 0.59, 0.74, 1.0);
|
||||
uniform vec4 highlight_color : source_color = vec4(0.64, 0.88, 0.93, 1.0);
|
||||
|
||||
uniform float primary_wave_scale : hint_range(0.01, 2.0, 0.01) = 0.52;
|
||||
uniform float secondary_wave_scale : hint_range(0.01, 2.0, 0.01) = 0.29;
|
||||
uniform vec2 primary_speed = vec2(0.16, 0.07);
|
||||
uniform vec2 secondary_speed = vec2(-0.08, 0.12);
|
||||
uniform float wave_strength : hint_range(0.0, 1.0, 0.01) = 0.42;
|
||||
|
||||
uniform float highlight_fresnel_strength : hint_range(0.0, 1.0, 0.01) = 0.22;
|
||||
uniform float fresnel_power : hint_range(0.5, 12.0, 0.1) = 4.0;
|
||||
uniform float roughness : hint_range(0.0, 1.0, 0.01) = 0.32;
|
||||
uniform float specular_strength : hint_range(0.0, 1.0, 0.01) = 0.28;
|
||||
|
||||
varying vec3 world_position;
|
||||
|
||||
|
||||
void vertex() {
|
||||
world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||
}
|
||||
|
||||
|
||||
void fragment() {
|
||||
const vec2 primary_direction = vec2(0.835, 0.550);
|
||||
const vec2 secondary_direction = vec2(-0.485, 0.875);
|
||||
|
||||
vec2 primary_coordinates = (
|
||||
world_position.xz * primary_wave_scale
|
||||
+ TIME * primary_speed
|
||||
);
|
||||
vec2 secondary_coordinates = (
|
||||
world_position.xz * secondary_wave_scale
|
||||
+ TIME * secondary_speed
|
||||
);
|
||||
float primary_phase = dot(primary_coordinates, primary_direction);
|
||||
float secondary_phase = dot(
|
||||
secondary_coordinates,
|
||||
secondary_direction
|
||||
);
|
||||
float primary_wave = sin(primary_phase);
|
||||
float secondary_wave = sin(secondary_phase);
|
||||
float combined_wave = (
|
||||
primary_wave * 0.62
|
||||
+ secondary_wave * 0.38
|
||||
);
|
||||
float wave_band = smoothstep(
|
||||
0.34,
|
||||
0.66,
|
||||
combined_wave * 0.5 + 0.5
|
||||
);
|
||||
|
||||
vec2 wave_slope = (
|
||||
cos(primary_phase)
|
||||
* primary_direction
|
||||
* primary_wave_scale
|
||||
* 0.62
|
||||
+ cos(secondary_phase)
|
||||
* secondary_direction
|
||||
* secondary_wave_scale
|
||||
* 0.38
|
||||
);
|
||||
vec3 world_normal = normalize(
|
||||
vec3(
|
||||
-wave_slope.x * wave_strength * 0.34,
|
||||
1.0,
|
||||
-wave_slope.y * wave_strength * 0.34
|
||||
)
|
||||
);
|
||||
NORMAL = normalize(
|
||||
(VIEW_MATRIX * vec4(world_normal, 0.0)).xyz
|
||||
);
|
||||
|
||||
float fresnel = pow(
|
||||
1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0),
|
||||
fresnel_power
|
||||
);
|
||||
vec3 water_color = mix(
|
||||
deep_color.rgb,
|
||||
wave_color.rgb,
|
||||
wave_band * wave_strength
|
||||
);
|
||||
ALBEDO = mix(
|
||||
water_color,
|
||||
highlight_color.rgb,
|
||||
fresnel * highlight_fresnel_strength
|
||||
);
|
||||
ROUGHNESS = roughness;
|
||||
SPECULAR = specular_strength;
|
||||
}
|
||||
1
world/materials/stylized_water.gdshader.uid
Normal file
1
world/materials/stylized_water.gdshader.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://lvo7xyr3c1k3
|
||||
7
world/materials/stylized_water.tres
Normal file
7
world/materials/stylized_water.tres
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[gd_resource type="ShaderMaterial" load_steps=2 format=3]
|
||||
|
||||
[ext_resource type="Shader" path="res://world/materials/stylized_water.gdshader" id="1_water_shader"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_water_shader")
|
||||
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue