scene.org File Archive

File download

<root>­/­parties­/­2021­/­tokyodemofest21­/­glsl/tdf_2021_rfs_musk_shader.zip

File size:
323 373 bytes (315.79K)
File date:
2021-12-12 11:40:28
Download count:
all-time: 18

Preview

  • tdf_2021_rfs_musk_shader.txt 6.84K
  • tdf_2021_rfs_shader_screenshot.jpg 313.47K

file_id.diz

// 1. goto https://glslsandbox.com/e
// 2. paste this code
// reflected structure by musk for TDF 2021 

#extension GL_OES_standard_derivatives : enable

precision highp float;

uniform sampler2D backbuffer;
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

vec3 col_1, col_2;

mat2 rotate(float a){
	float c=cos(a), s=sin(a);
	return mat2(
		+c, +s,
		-s, +c
	);
}

float ss_noise(float seed){
	vec2 s = gl_FragCoord.xy;
	return fract(
		(sin(dot(s,s)*0.2531+dot(s.xy,s.yx)*0.31343+dot(s,vec2(31.541+fract(seed*50.1191),54.932-fract(seed*30.1191)))-fract(seed*1.7191)))*765.4567
	);
}

vec3 sphere_noise(float seed){
	vec3 n;
	for (int i=0; i<3; i++){
		n = (vec3(ss_noise(seed+.93), ss_noise(seed+.31), ss_noise(seed+.56))-vec3(.5))*2.0;
		if (length(n) < 1.0) {
			return n;
		}
	}
	return n;
}

float df(vec3 p)//distance function
{
	//float d=1.0-abs(p.y);
	
	float t = time;
	p.x+=t*0.07;	
	p.z+=t*.03;

		float s = length(p);

	p.y=abs(p.y);
	
	p.y-=5.0;
	
	float d = 0.5-p.y;
	
	for (int i=0; i<10; i++)
	{
		float fi = float(i);
		
		p+=vec3(1.25-fi,0.0,1.75+fi);
		vec3 pm;
		
		float rep = 10.0+sin(fi*2.0+1.0)*4.0;
		
		pm.xz = mod(p.xz+vec2(rep*.5),vec2(rep))-vec2(rep*.5);
		
		float width = 1.0+sin(fi)*.8;
		float height = 2.0+cos(fi)*1.1;
		float offset = -0.5+cos(fi)*1.8;

		vec3 df = abs(vec3(pm.x,p.y+1.0/width,pm.z))-vec3(width,height,width);
		float box = max(max(df.x,df.y),df.z);
		//float box=length(vec3(pm.x,p.y,pm.z))-1.0;
	
		d = min(d,box);
	}

	return d;
}

vec3 nf(vec3 p, float d){
	vec2 e = vec2(0,d);
	return normalize(vec3(
		df(vec3(p+e.yxx))-df(vec3(p-e.yxx)),
		df(vec3(p+e.xyx))-df(vec3(p-e.xyx)),
		df(vec3(p+e.xxy))-df(vec3(p-e.xxy))
	));
}

float pat(vec3 p){
	float q = 2.0*(abs(fract(df(p+vec3(3.))*13.0)-.5));
	float dq2 = df(p-vec3(1))*.1;
	float q2 = smoothstep(.2,.3, (abs(fract(dq2*32.0)-0.5)*2.0));
	float q3 = smoothstep(.2,.3, (abs(fract(dq2*16.0)-0.5)*2.0));
	float q4 = smoothstep(.2,.3, (abs(fract(dq2*16.0)-0.5)*2.0));
	return smoothstep(.7,.8,q)*q2*q3;
}

float fat_pat(vec3 p){
	float q = 2.0*(abs(fract(df(p+vec3(3.))*8.0)-.5));
	float dq2 = df(p-vec3(1))*.1;
	float q2 = smoothstep(.2,.3, (abs(fract(dq2*32.0)-0.5)*2.0));
	float q3 = smoothstep(.2,.3, (abs(fract(dq2*16.0)-0.5)*2.0));
	float q4 = smoothstep(.2,.3, (abs(fract(dq2*16.0)-0.5)*2.0));
	return smoothstep(-.1,.6,q)*q2*q3;
}

float wave(float x){
	return max(.0, (1./(3.+sin(x)+sin(x*2.)))-.3);
}

vec3 ef(vec3 p){
	float pt = pat(p);
	return max(vec3(.0), pt*col_1*20.0*(wave((p.x+p.z)*.6+time)))
		+max(vec3(.0), pt*col_2*20.0*(wave((p.x-p.z)*.125+time)));
}

vec3 fat_ef(vec3 p){
	float pt = fat_pat(p);
	return max(vec3(.0), pt*col_1*20.0*(sin((p.x+p.z)*.5+time)-.5))
		+max(vec3(.0), pt*col_2*20.0*(sin((p.x-p.z)*.125+time)-.5));
}

vec3 decode_color(vec3 frag){
	return frag.xyz / (vec3(1.431)-frag);
}

vec3 encode_color(vec3 color){
	return (vec3(1.431)*color)/(vec3(1)+color);
}

void main( void ) {
	
	col_1 = mix( vec3(.9,.1,.1), vec3(.2,.5,.9), smoothstep(-.5,.5,sin(time*.167)) );
	col_2 = mix( vec3(.7,.3,.1), vec3(.9,.9,.9), smoothstep(-.5,.5,sin(time*.134)) );

	vec2 uv = gl_FragCoord.xy / resolution.xy;
	vec2 nuv = (uv-0.5)*2.0;

	vec3 color = vec3(0.0);
	float it_count, dist = ss_noise(time)*.1;
	vec3 pos = vec3(0,0,4);
	vec2 smpn = vec2(ss_noise(time+1.),ss_noise(time+2.));
	vec3 dir = normalize(vec3((gl_FragCoord.xy+smpn-resolution.xy*.5)/resolution.yy, -0.4));
	dir.z += pow(length(dir),2.0)*0.4;
	dir = normalize(dir);
	dir.xy *= rotate(.1);
	dir.xz *= rotate(+time*.025);
	pos.xz *= rotate(-time*.025);
	
	for (int it=0; it<100; it+=1){
		float d = df(pos+dist*dir);
		dist += d;
		if (d<1e-3) break;
		it_count = float(it);
	}
	vec3 pos_2 = pos+dist*dir;
	
	vec3 norm_outline = nf(pos_2, 48.0*dist/resolution.y);
	vec3 norm = nf(pos_2, 2.0*dist/resolution.y);
	
	vec3 em_2 = ef(pos_2);
	float pat_2 = pat(pos_2);
	float refl_2 = mix(pow(clamp(1.0+dot(norm, dir),.0,1.),4.0),1.0,0.2);
	
	// specular
	vec3 dir_2 = normalize(reflect(dir, norm + max(.0,.005-pat_2)*sphere_noise(time+93.1)));
	float dist_2 = ss_noise(time+.43)*.1+.1;
	for (int it=0; it<50; it++){
		float d = df(pos_2+dist_2*dir_2);
		dist_2 += d;
		if (d<1e-3) break;
	}
	vec3 pos_3 = pos_2+dist_2*dir_2;
	vec3 em_3 = ef(pos_3);
	
	vec3 em = em_2;
	vec3 specular = em_3;
	
	// diffuse
	float diffuse_count = .0;
	vec3 diffuse_color = vec3(.0);
	for (int dic=0; dic<10; dic++){
		vec3 d_dir=normalize(norm + .75*sphere_noise(1.0+dot(pos_2,diffuse_color)-time+diffuse_count));
		float d_dist = (1.0/dot(norm, d_dir))*.005;
		for (int dit=0; dit<10; dit++){
			float d = df(pos_2+d_dir*d_dist);
			d_dist += d;
			if (d<1e-3) break;
		}
		diffuse_count += 1.0;
		diffuse_color += ef(pos_2+d_dir*d_dist);
	}
	diffuse_color *= mix(1.0, .5,pat_2)/diffuse_count;
	
	color = mix(diffuse_color +mix(em_2, em_2*vec3(.8,.6,.4), pat_2), specular, refl_2);
	// color = vec3(refl_2);
	color *= (1.0-1.4*length(uv-vec2(0.5)))*2.0;
	
	// color = diffuse_color; //dbg
	// color = vec3(pat_2); //dbg
	// color = vec3(vec3(0.1,.2,.3)*it_count*0.4); //dbg maytbe
	

	float out_dist = .01;
	float outline = 1.0-clamp((1.0-df(pos_2+norm_outline*out_dist)/out_dist)*4.0, 0.0, 1.0);
	outline = mix(outline, 1.0, pow(smoothstep(16.,64.,dist),0.0));
	
	//color = vec3(outline); //dbg maybe transition
	
	vec4 last_frag = (texture2D(backbuffer, uv+nuv*0.005)*vec4(.45,.25,.05,0.25) + texture2D(backbuffer, uv-nuv*0.005)*vec4(.05,.25,.45,0.25))*2.0;
	vec4 last_n0_frag = texture2D(backbuffer, (gl_FragCoord.xy + vec2(1,0)) / resolution.xy);
	vec4 last_n1_frag = texture2D(backbuffer, (gl_FragCoord.xy - vec2(1,0)) / resolution.xy);
	vec4 last_n2_frag = texture2D(backbuffer, (gl_FragCoord.xy + vec2(0,1)) / resolution.xy);
	vec4 last_n3_frag = texture2D(backbuffer, (gl_FragCoord.xy - vec2(0,1)) / resolution.xy);
	
	vec3 last_color = decode_color(last_frag.rgb);
	vec3 last_n0_color = decode_color(last_n0_frag.rgb) * last_n0_frag.a;	
	vec3 last_n1_color = decode_color(last_n1_frag.rgb) * last_n1_frag.a;
	vec3 last_n2_color = decode_color(last_n2_frag.rgb) * last_n2_frag.a;
	vec3 last_n3_color = decode_color(last_n3_frag.rgb) * last_n3_frag.a;
	
	float last_n_weight_sum = last_n0_frag.a + last_n1_frag.a + last_n2_frag.a + last_n3_frag.a;
	vec3 last_n_color = (last_n0_color + last_n1_color + last_n2_color + last_n3_color) / last_n_weight_sum;
	float last_n_weight = last_n_weight_sum / 4.0;
	
	
	color = max(vec3(0), color);
	color = mix(color, last_color, smoothstep(0.,1.,0.55*outline+dist*.001));
	// color += em;
	if (last_n_weight > 1e-2){
		color = mix(color, last_n_color, smoothstep(.0,.9,outline*.55*last_n_weight+dist*0.0025));
	}
	color += vec3((ss_noise(time+9.34)-0.5)*0.005);
	
	gl_FragColor = vec4( encode_color(color), outline );

}