67 lines
1.8 KiB
Plaintext
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;
|
|
|
|
}
|