50 lines
1.3 KiB
Plaintext
50 lines
1.3 KiB
Plaintext
shader_type spatial;
|
|
|
|
uniform float scale : hint_range(0.1, 2.0, 0.1) = 1.0;
|
|
uniform float speed : hint_range(0.1, 2.0, 0.1) = 0.2;
|
|
uniform float strenght : hint_range(10., 500., 10.) = 100.;
|
|
uniform sampler2D color_ramp;
|
|
varying vec3 world_position;
|
|
|
|
vec2 random(vec2 uv) {
|
|
return vec2(fract(sin(dot(uv.xy,
|
|
vec2(12.9898,78.233))) * 43758.5453123));
|
|
}
|
|
|
|
float worley(vec2 uv, float columns, float rows) {
|
|
|
|
vec2 index_uv = floor(vec2(uv.x * columns, uv.y * rows));
|
|
vec2 fract_uv = fract(vec2(uv.x * columns, uv.y * rows));
|
|
|
|
float minimum_dist = 1.0;
|
|
|
|
for (int y= -1; y <= 1; y++) {
|
|
for (int x= -1; x <= 1; x++) {
|
|
vec2 neighbor = vec2(float(x),float(y));
|
|
vec2 point = random(index_uv + neighbor);
|
|
|
|
vec2 diff = neighbor + point - fract_uv;
|
|
float dist = length(diff);
|
|
minimum_dist = min(minimum_dist, dist);
|
|
}
|
|
}
|
|
|
|
return minimum_dist;
|
|
}
|
|
|
|
void vertex(){
|
|
world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
|
}
|
|
|
|
void fragment(){
|
|
float worley_value = worley(world_position.xz * scale + TIME * speed, 3.0, 3.0);
|
|
float worley_value_2 = worley(world_position.xz * scale * 2. - TIME * speed, 3.0, 3.0);
|
|
|
|
float color = texture(color_ramp, vec2(worley_value*worley_value_2)).r;
|
|
color = min(0.99, color);
|
|
color = log(0.999)/log(color);
|
|
color *= strenght;
|
|
ALPHA = color;
|
|
EMISSION = vec3(color);
|
|
}
|