immersive-home/app/assets/materials/grid.gdshader
2024-05-26 16:40:00 +02:00

47 lines
1.2 KiB
Plaintext

shader_type spatial;
render_mode unshaded, cull_back;
uniform float dot_size: hint_range(0.0, 1.0, 0.01) = 0.5;
uniform float dot_falloff: hint_range(0.0, 0.4, 0.001) = 0.1;
uniform float size: hint_range(1.0, 32.0, 0.1) = 16.0;
uniform vec2 dot_offset = vec2(0.0);
uniform int supersampling: hint_range(0, 10, 1) = 1;
vec2 random(vec2 st){
return vec2(fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123), fract(sin(dot(st.xy, vec2(-40.644))) * 87502.29935));
}
float sdf_sphere(vec2 position, float center_dist) {
return length(position) - max(0.0, dot_size / size - center_dist * dot_falloff);
}
vec2 sdf_repeat(vec2 position) {
float inv_size = 1.0 / (size * 2.0);
return fract(position * size) / size - inv_size;
}
void fragment() {
float total_dist = 0.0;
for(int i = 0; i < supersampling; i++) {
float center_dist = distance(UV, vec2(0.5, 0.5));
vec2 rand = random(vec2(float(i))) * 0.004 * (0.5 - center_dist);
float dist = sdf_sphere(sdf_repeat(UV - dot_offset - rand), center_dist);
if (dist <= 0.0) {
total_dist += 1.0 / float(supersampling);
}
}
ALBEDO = vec3(1.0);
ALPHA = total_dist;
//if(dist <= 0.0) {
//ALBEDO = vec3(1.0);
//} else {
//ALBEDO = vec3(1.0);
//ALPHA = dist;
//}
}