86 lines
2.0 KiB
Plaintext
86 lines
2.0 KiB
Plaintext
shader_type spatial;
|
|
render_mode depth_draw_opaque;
|
|
|
|
uniform float height_scale = 0.3;
|
|
uniform float wave_speed = 0.2;
|
|
uniform float upper_transparency = 0.99;
|
|
uniform float global_transparency = 0.9;
|
|
|
|
uniform vec2 time_factor = vec2(2.0, 3.0);
|
|
uniform sampler2D texture_albedo : source_color;
|
|
uniform vec3 uv1_scale;
|
|
uniform vec3 uv1_offset;
|
|
|
|
uniform vec4 color1 : source_color = vec4(0.88, 0.91, 0.93, 1.0);
|
|
uniform vec4 color2 : source_color = vec4(0.88, 0.99, 0.95, 1.0);
|
|
|
|
varying flat vec3 out_color;
|
|
varying flat vec3 soft_color;
|
|
|
|
vec3 lerpColor(vec4 a, vec4 b, float t){
|
|
float rr = a.r + (b.r - a.r) * t;
|
|
float gg = a.g + (b.g - a.g) * t;
|
|
float bb = a.b + (b.b - a.b) * t;
|
|
return vec3(rr, gg, bb);
|
|
}
|
|
|
|
float hash(vec2 p) {
|
|
return fract(sin(dot(p * 17.17, vec2(14.91, 67.31))) * 4791.9511);
|
|
}
|
|
|
|
|
|
|
|
float noise(vec2 x) {
|
|
vec2 p = floor(x);
|
|
vec2 f = fract(x);
|
|
f = f * f * (3.0 - 2.0 * f);
|
|
vec2 a = vec2(1.0, 0.0);
|
|
return mix(mix(hash(p + a.yy), hash(p + a.xy), f.x),
|
|
mix(hash(p + a.yx), hash(p + a.xx), f.x), f.y);
|
|
}
|
|
|
|
float fbm(vec2 x, float time) {
|
|
float height = 0.1;
|
|
float amplitude = 0.5;
|
|
float frequency = 9.5;
|
|
for (int i = 0; i < 6; i++){
|
|
height += noise(x * frequency + time * time_factor * wave_speed) * amplitude;
|
|
amplitude *= 0.5;
|
|
frequency *= 2.0;
|
|
}
|
|
return height;
|
|
}
|
|
|
|
void vertex() {
|
|
|
|
UV=UV*uv1_scale.xy+uv1_offset.xy;
|
|
|
|
out_color = vec3(color1.r, color1.g, color1.b);
|
|
soft_color = vec3(color1.r, color1.g, color1.b);
|
|
|
|
float height = fbm(VERTEX.xz * 4.0, TIME);
|
|
VERTEX.y += height * height_scale;
|
|
COLOR.xyz = vec3(height);
|
|
|
|
if (VERTEX.y > 0.3){
|
|
out_color = lerpColor(color1, color2, clamp((VERTEX.y) / 3.0, 0.5, 1.0));
|
|
soft_color = vec3(color2.r, color2.g, color2.b);
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void fragment(){
|
|
|
|
ALBEDO = COLOR.xyz;
|
|
vec2 base_uv = UV;
|
|
vec4 albedo_tex = texture(texture_albedo,base_uv);
|
|
ALPHA = global_transparency;
|
|
ALBEDO = out_color * albedo_tex.rgb * COLOR.xyz;
|
|
if (soft_color.r==color2.r && soft_color.g==color2.g && color2.b==color2.b) {
|
|
ALPHA = upper_transparency;
|
|
}
|
|
} |