Files
tgcc-artest/Shaders/tree_leaves_1.gdshader
Matteo Sonaglioni f7b334b21c first commit
2026-03-10 23:54:57 +01:00

67 lines
1.8 KiB
Plaintext

shader_type spatial;
render_mode specular_disabled, cull_back;
global uniform float wind_scale;
global uniform float wind_speed;
global uniform float wind_strength;
global uniform vec3 wind_direction;
global uniform sampler2D wind_noise : filter_linear_mipmap;
uniform vec4 color: source_color;
uniform sampler2D alpha;
uniform float leaves_scale = 1.0;
uniform float leaf_bend_amount = 0.7;
uniform float light_steps = 5.0;
varying vec4 view_pos;
varying vec4 world_pos;
void vertex() {
world_pos = MODEL_MATRIX * vec4(VERTEX, 1.0);
view_pos = MODELVIEW_MATRIX * vec4(VERTEX, 1.0);
float speed = TIME * wind_speed;
// Noise for animation
float noise_texture = textureLod(wind_noise, (world_pos.xz * wind_scale) - (speed * wind_direction.xz), 1.0).r;
noise_texture = (noise_texture * 2. - 1.) * (wind_strength * leaf_bend_amount);
//Leaves Billboard
vec4 new_position = vec4(UV.y, UV.x, 0.0, 1.0);
new_position = new_position *2. - 1.;
new_position = normalize(new_position);
new_position *= leaves_scale;
// Leaves animation
new_position += noise_texture * vec4(1.0, 0.0, 0.0, 0.0) * (UV.x * 2.0 - 1.0) - noise_texture * vec4(0.0, 1.0, 0.0, 0.0) * (UV.y * 2.0 - 1.0);
new_position *= MODELVIEW_MATRIX;
VERTEX += new_position.xyz;
}
void fragment() {
ALBEDO = color.rgb;
ALPHA = texture(alpha, UV).r;
ALPHA_SCISSOR_THRESHOLD = 0.5;
ROUGHNESS = 0.0;
SPECULAR = 0.0;
LIGHT_VERTEX = view_pos.xyz;
}
void light() {
// Cel shaded diffuse lighting
float light = clamp(dot(NORMAL, LIGHT), 0.0, 1.0);
light = ceil(light * light_steps) / light_steps;
DIFFUSE_LIGHT += light * (LIGHT_COLOR / PI) * ATTENUATION;
// Rim Lighting
float rim = 1.0 - dot(NORMAL, VIEW);
rim *= light;
rim = round(rim * light_steps) / light_steps;
rim = rim * rim;
DIFFUSE_LIGHT += rim * ATTENUATION * LIGHT_COLOR / PI;
}