47 lines
1.5 KiB
Plaintext
47 lines
1.5 KiB
Plaintext
shader_type spatial;
|
|
render_mode blend_add, cull_disabled, unshaded;
|
|
|
|
uniform sampler2D dust : source_color;
|
|
uniform float dust_speed = 0.03;
|
|
uniform vec4 color : source_color;
|
|
uniform float intensity = 2.75;
|
|
uniform float softness = 3.0;
|
|
|
|
// Godot 4 explicit texture hints
|
|
uniform sampler2D depth_texture : hint_depth_texture, filter_linear_mipmap;
|
|
uniform sampler2D screen_texture : hint_screen_texture, filter_linear_mipmap;
|
|
|
|
uniform float proximity_fade_distance = 0.5;
|
|
uniform float distance_fade_min = 1.0;
|
|
uniform float distance_fade_max = 2.0;
|
|
|
|
varying vec3 obj_vertex;
|
|
|
|
void vertex() {
|
|
obj_vertex = VERTEX;
|
|
}
|
|
|
|
void fragment() {
|
|
// Dust texture sampling using screen coordinates
|
|
vec2 dust_uv = vec2(SCREEN_UV.x + dust_speed * TIME, SCREEN_UV.y);
|
|
vec4 dust_overlay = texture(dust, dust_uv);
|
|
|
|
float attenuation = clamp(1.0 + obj_vertex.y / intensity, 0.0, 1.0);
|
|
float soft_edge = clamp(pow(dot(NORMAL, normalize(VERTEX)), softness), 0.0, 1.0);
|
|
|
|
ALBEDO = dust_overlay.rgb * color.rgb * attenuation * soft_edge;
|
|
|
|
// Proximity Fade calculation in Godot 4
|
|
float depth_raw = texture(depth_texture, SCREEN_UV).r;
|
|
vec4 ndc = vec4(SCREEN_UV * 2.0 - 1.0, depth_raw, 1.0);
|
|
vec4 view_pos = INV_PROJECTION_MATRIX * ndc;
|
|
view_pos.xyz /= view_pos.w;
|
|
|
|
float depth_diff = -VERTEX.z - (-view_pos.z);
|
|
float proximity_alpha = clamp(depth_diff / proximity_fade_distance, 0.0, 1.0);
|
|
|
|
// Distance Fade calculation
|
|
float dist_alpha = clamp(smoothstep(distance_fade_min, distance_fade_max, -VERTEX.z), 0.0, 1.0);
|
|
|
|
ALPHA = proximity_alpha * dist_alpha;
|
|
} |