generated from krampus/template-godot4
103 lines
1.9 KiB
Plaintext
103 lines
1.9 KiB
Plaintext
// Voronoi fractal steel material
|
|
// Based on https://www.shadertoy.com/view/4sl3Dr
|
|
shader_type spatial;
|
|
|
|
uniform vec2 uv_scale = vec2(1.0);
|
|
uniform float edge_sharpness = 0.25;
|
|
|
|
uniform vec3 base_color: source_color = vec3(1.0);
|
|
|
|
uniform int octaves = 3;
|
|
|
|
uniform float octave_dropoff = 0.7;
|
|
uniform float octave_scale = 3.0;
|
|
|
|
|
|
uniform float metallic = 1.0;
|
|
uniform float roughness_scale = 1.0;
|
|
uniform float bump_strength = 1.0;
|
|
|
|
// 1D random numbers
|
|
float rand(float n)
|
|
{
|
|
return fract(sin(n) * 43758.5453123374897);
|
|
}
|
|
|
|
// 2D random numbers
|
|
vec2 rand2(vec2 p)
|
|
{
|
|
return fract(vec2(sin(p.x * 591.32 + p.y * 154.077), cos(p.x * 391.32 + p.y * 49.077)));
|
|
}
|
|
|
|
// 1D noise
|
|
float noise1(float p)
|
|
{
|
|
float fl = floor(p);
|
|
float fc = fract(p);
|
|
return mix(rand(fl), rand(fl + 1.0), fc);
|
|
}
|
|
|
|
// voronoi distance noise, based on iq's articles
|
|
float voronoi(vec2 x)
|
|
{
|
|
vec2 p = floor(x);
|
|
vec2 f = fract(x);
|
|
|
|
vec2 res = vec2(8.0);
|
|
for(float j = -1.0; j <= 1.0; j ++)
|
|
{
|
|
for(float i = -1.0; i <= 1.0; i ++)
|
|
{
|
|
vec2 b = vec2(i, j);
|
|
vec2 r = vec2(b) - f + rand2(p + b);
|
|
|
|
// chebyshev distance, one of many ways to do this
|
|
float d = max(abs(r.x), abs(r.y));
|
|
|
|
if(d < res.x)
|
|
{
|
|
res.y = res.x;
|
|
res.x = d;
|
|
}
|
|
else if(d < res.y)
|
|
{
|
|
res.y = d;
|
|
}
|
|
}
|
|
}
|
|
return res.y - res.x;
|
|
}
|
|
|
|
void fragment() {
|
|
vec2 uv = (UV - 0.5) * 2.0 * uv_scale;
|
|
|
|
float value = 0.0;
|
|
|
|
// Octaves
|
|
float a = 0.6;
|
|
float f = 1.0;
|
|
for(int i = 0; i < octaves; i++) {
|
|
float v1 = voronoi(uv * f + 5.0);
|
|
float v2 = 0.0;
|
|
|
|
// Sharp edges
|
|
v1 = 1.0 - smoothstep(0.0, edge_sharpness, v1);
|
|
// noise as intensity map
|
|
v2 = a * (noise1(v1 * 5.5 + 0.1));
|
|
|
|
value += v2;
|
|
|
|
f *= octave_scale;
|
|
a *= octave_dropoff;
|
|
}
|
|
|
|
// Use value as bump map
|
|
float dZ = 1.0 / bump_strength;
|
|
vec3 nmap = normalize(vec3(dFdx(value), dFdy(value), dZ));
|
|
NORMAL_MAP = nmap / 2.0 + 1.0;
|
|
|
|
|
|
ALBEDO = value * base_color;
|
|
ROUGHNESS = value * roughness_scale;
|
|
METALLIC = metallic;
|
|
} |