69 lines
2.1 KiB
Plaintext
69 lines
2.1 KiB
Plaintext
shader_type spatial;
|
|
render_mode cull_disabled, specular_disabled;
|
|
|
|
|
|
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 sampler2D flower_texture : source_color, filter_nearest;
|
|
uniform float flower_bendiness = 1.0;
|
|
uniform float sway_back : hint_range(0.0, 1.0, 0.01) = 1.0;
|
|
uniform float light_steps = 3.0;
|
|
|
|
varying vec3 node_pos_view;
|
|
varying vec3 node_pos_world;
|
|
varying vec4 world_pos;
|
|
|
|
vec4 CalculateWind(vec4 position, float speed, vec3 rotate_direction, float bend, float uv_scale, float mip_level){
|
|
|
|
// Scrolling Wind Noise
|
|
vec3 noise_texture = textureLod(wind_noise, (position.xz * uv_scale) + (speed * -wind_direction.xz), mip_level).rgb;
|
|
noise_texture = noise_texture * (1. + sway_back) - sway_back;
|
|
|
|
// Vertex Displacement
|
|
vec4 displace = vec4((noise_texture * rotate_direction - noise_texture * noise_texture * vec3(0.0, 1.0, 0.0) * bend) , 0.0);
|
|
return displace;
|
|
}
|
|
|
|
void vertex() {
|
|
// Parameters
|
|
world_pos = MODEL_MATRIX * vec4(VERTEX, 1.0);
|
|
node_pos_view = NODE_POSITION_VIEW;
|
|
node_pos_world = NODE_POSITION_WORLD;
|
|
|
|
// Wind Animation
|
|
float speed = TIME * wind_speed;
|
|
float uv_scale = wind_scale;
|
|
float wind_intensity = wind_strength * flower_bendiness;
|
|
|
|
vec4 direction = inverse(MODEL_MATRIX) * vec4(wind_direction, 0.0);
|
|
|
|
vec4 displace = CalculateWind(world_pos, speed, direction.xyz, flower_bendiness, uv_scale, 4.0);
|
|
displace *= wind_intensity;
|
|
|
|
VERTEX += displace.rgb;
|
|
}
|
|
|
|
void fragment() {
|
|
|
|
vec4 color = texture(flower_texture, UV);
|
|
|
|
ALBEDO = color.rgb;
|
|
ALPHA = color.a;
|
|
ALPHA_SCISSOR_THRESHOLD = 0.75;
|
|
|
|
SPECULAR = 0.0;
|
|
ROUGHNESS = 0.0; // rougness is being used as a mask for the outline
|
|
LIGHT_VERTEX = node_pos_view; // shade the entire mesh based on the object position(pivot) instead of the pixel position
|
|
}
|
|
|
|
void light(){
|
|
//Diffuse lighting
|
|
float light = clamp(dot(NORMAL, LIGHT), 0.0, 1.0);
|
|
light = round(light * light_steps) / light_steps;
|
|
|
|
DIFFUSE_LIGHT += light * (LIGHT_COLOR / PI) * ATTENUATION;
|
|
} |