nature-sim/see_through.gdshader
Dan Baker f98773237e Implements tree visibility occlusion system.
Adds tree fading based on camera line of sight.
Trees now fade out when they obstruct the player's view,
improving visibility.

Also includes several fixes:
- Fixes tree distribution.
- Adds a see-through shader.
- Adds camera and occlusion scripts.
2025-07-01 10:32:21 +01:00

41 lines
No EOL
1.5 KiB
Text

shader_type spatial;
// Uniforms that can be controlled from GDScript
uniform float model_height : hint_range(0.1, 100.0) = 10.0;
uniform float transition_width : hint_range(0.01, 0.5) = 0.1;
uniform vec4 base_color : source_color = vec4(1.0, 1.0, 1.0, 1.0);
uniform float effect_strength : hint_range(0.0, 1.0) = 1.0;
uniform sampler2D main_texture : source_color;
uniform float metallic : hint_range(0.0, 1.0) = 0.0;
uniform float roughness : hint_range(0.0, 1.0) = 0.5;
varying vec3 world_position;
void vertex() {
world_position = VERTEX;
}
void fragment() {
// Get the base texture color
vec4 tex_color = texture(main_texture, UV);
// Calculate normalized Y position (0.0 at bottom, 1.0 at top)
// This uses the local vertex position - adjust based on your model's bounds
float normalized_y = (world_position.y + model_height * 0.5) / model_height;
// Define fade boundaries - top 80% invisible, bottom 20% visible
float fade_start = 0.2; // Start fading at 20% from bottom
float fade_end = fade_start - transition_width;
// Calculate position-based alpha
float position_alpha = smoothstep(fade_end, fade_start, normalized_y);
// Blend between full visibility and position-based alpha based on effect strength
float final_alpha = mix(1.0, position_alpha, effect_strength);
// Set material properties
ALBEDO = base_color.rgb * tex_color.rgb;
ALPHA = base_color.a * tex_color.a * final_alpha;
METALLIC = metallic;
ROUGHNESS = roughness;
}