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; }