feat: implement water shader and environment for free mode arena

This commit is contained in:
Yogi Wiguna
2026-03-31 15:59:00 +08:00
parent 3454710f2c
commit 1e6da89fff
16 changed files with 337 additions and 116 deletions
@@ -0,0 +1,83 @@
shader_type spatial;
render_mode cull_disabled;
uniform vec3 albedo : source_color;
uniform vec3 albedo2 : source_color;
uniform float metallic : hint_range(0.0, 1.0) = 0;
uniform float roughness : hint_range(0.0, 1.0) = 0.02;
uniform sampler2D wave;
uniform sampler2D texture_normal;
uniform sampler2D texture_normal2;
uniform vec2 wave_direction = vec2(2.0,0.0); // Direction of wave 1
uniform vec2 wave_direction2 = vec2(0.0,1.0); // Direction of wave 2
uniform float time_scale : hint_range(0.0, 0.2, 0.005) = 0.025; // Rate of movement multiplied by TIME
uniform float noise_scale = 10.0;
uniform float height_scale = 0.15;
uniform vec4 color_deep : source_color; // Deep depth color
uniform vec4 color_shallow : source_color; // Shallow depth color
uniform float beers_law = 2.0; // Beer's law application
uniform float depth_offset = -0.75; // Offset
uniform float edge_scale = 0.1;
uniform float near = 1.0;
uniform float far = 100.0;
uniform vec3 edge_color : source_color;
uniform sampler2D DEPTH_TEXTURE : hint_depth_texture, filter_linear_mipmap;
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
// Varying variables
varying float height;
varying vec3 world_pos;
float fresnel(float amount, vec3 normal, vec3 view)
{
return pow((1.0 - clamp(dot(normalize(normal), normalize(view)), 0.0, 1.0 )), amount);
}
float edge(float depth){
depth = 2.0 * depth - 1.0;
return near * far / (far + depth * (near - far));
}
void vertex() {
world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
height = texture(wave, world_pos.xz / noise_scale + TIME * time_scale).r;
VERTEX.y += height * height_scale;
}
void fragment() {
// Depth variables and calc
float depth_texture = texture(DEPTH_TEXTURE, SCREEN_UV).r * 2.0 - 1.0;
float depth = PROJECTION_MATRIX[3][2] / (depth_texture + PROJECTION_MATRIX[2][2]);
float depth_blend = exp((depth+VERTEX.z + depth_offset) * -beers_law);
depth_blend = clamp(1.0 - depth_blend, 0.0, 1.0);
float depth_blend_power = clamp(pow(depth_blend, 2.5), 0.0, 1.0);
// Retrieving depth color and applying the deep and shallow colors
vec3 screen_color = textureLod(SCREEN_TEXTURE, SCREEN_UV, depth_blend_power * 2.5).rgb;
vec3 depth_color = mix(color_shallow.rgb, color_deep.rgb, depth_blend_power);
vec3 color = mix(screen_color * depth_color, depth_color * 0.25, depth_blend_power * 0.5);
// Getting edge depth calc
float z_depth = edge(texture(DEPTH_TEXTURE, SCREEN_UV).x);
float z_pos = edge(FRAGCOORD.z);
float z_dif = z_depth - z_pos;
// Time calculations for wave (normal map) movement
vec2 time = (TIME * wave_direction) * time_scale; // Movement rate of first wave
vec2 time2 = (TIME * wave_direction2) * time_scale; // Movement rate of second wave
// Blend normal maps into one
vec3 normal_blend = mix(texture(texture_normal,world_pos.xz + time).rgb, texture(texture_normal2,world_pos.xz + time2).rgb, 0.5);
// Calculate Fresnel
float fresnel = fresnel(5.0, NORMAL, VIEW);
vec3 surface_color = mix(albedo, albedo2, fresnel); // Interpolate albedo values by frensel
vec3 depth_color_adj = mix(edge_color, color, step(edge_scale, z_dif));
ALBEDO = clamp(surface_color + depth_color_adj,vec3(0.0),vec3(1.0));
METALLIC = metallic;
ROUGHNESS = roughness;
NORMAL_MAP = normal_blend;
}
@@ -0,0 +1 @@
uid://chabrdico7377
@@ -0,0 +1,6 @@
[gd_resource type="PanoramaSkyMaterial" format=3 uid="uid://bdwxlbar41mxw"]
[ext_resource type="Texture2D" uid="uid://didk5l287jms7" path="res://assets/levels/level_water/sky_sea_01.png" id="1_f0k4a"]
[resource]
panorama = ExtResource("1_f0k4a")
@@ -0,0 +1,13 @@
[gd_resource type="Environment" format=3 uid="uid://d07fd5dsr0xv"]
[ext_resource type="Material" uid="uid://bdwxlbar41mxw" path="res://assets/levels/level_water/level_water.tres" id="1_gsk4i"]
[sub_resource type="Sky" id="Sky_u7obs"]
sky_material = ExtResource("1_gsk4i")
[resource]
background_mode = 2
sky = SubResource("Sky_u7obs")
ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
reflected_light_source = 2
Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dep1ng3aqb2jw"
path.s3tc="res://.godot/imported/sky_sea_01.png-02f4e2484e4bcee94a60ae25a0ef8549.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/models/arena/free_mode/sky_sea_01.png"
dest_files=["res://.godot/imported/sky_sea_01.png-02f4e2484e4bcee94a60ae25a0ef8549.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0
@@ -0,0 +1,38 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://xifgjdr8285d"]
[ext_resource type="Shader" uid="uid://chabrdico7377" path="res://assets/models/arena/free_mode/level_water.gdshader" id="1_nuaxy"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_s0tpp"]
noise_type = 0
seed = 5
frequency = 0.0166
metadata/_preview_in_3d_space_ = true
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_6vard"]
noise = SubResource("FastNoiseLite_s0tpp")
seamless = true
as_normal_map = true
seamless_blend_skirt = 1.0
bump_strength = 25.6
[resource]
render_priority = 0
shader = ExtResource("1_nuaxy")
shader_parameter/albedo = Color(0.14, 0.382667, 0.7, 1)
shader_parameter/albedo2 = Color(0.54, 0.77, 1, 1)
shader_parameter/metallic = 0.0
shader_parameter/roughness = 0.02
shader_parameter/texture_normal = SubResource("NoiseTexture2D_6vard")
shader_parameter/wave_direction = Vector2(2, 0)
shader_parameter/wave_direction2 = Vector2(0, 1)
shader_parameter/time_scale = 0.025
shader_parameter/noise_scale = 10.0
shader_parameter/height_scale = 0.15
shader_parameter/color_deep = Color(0.513233, 0.513233, 0.513233, 1)
shader_parameter/color_shallow = Color(0.716296, 0.716296, 0.716296, 1)
shader_parameter/beers_law = 2.0
shader_parameter/depth_offset = -0.75
shader_parameter/edge_scale = 0.1
shader_parameter/near = 1.0
shader_parameter/far = 100.0
shader_parameter/edge_color = Color(0.215902, 0.215902, 0.215902, 1)