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; | ||
|  | } |