/* * ubershader.sl : base shader for evolving parameters * Matthew Lewis (http://www.cgrg.ohio-state.edu/~mlewis) */ #include "rmannotes.sl" /* noise calls always use amplitude, frequency, and seed hue/saturation/value are specified via hsv background is bg, tile is t */ #define pudn(x,lo,hi,p) (smoothstep(.25, .75, pnoise((x),(p))) * \ ((hi) - (lo)) + (lo)) #define pudn2(x,y,lo,hi,p1,p2) (smoothstep(.25, .75, \ pnoise((x),(y),(p1),(p2))) * ((hi)-(lo))+(lo)) /************************************************************/ /* turbulant, noisy value generator function here */ float nfilt2(float def, min, max; float do_noiz, np1, np2, ns1, ns2, nf, na; float do_turb, mf; /* turb params */ ) { float val = def; if(do_turb>0.5) { float nf2 = (nf<1) ? 1 : nf; float f, turb=0; for (f = 1; f < mf; f *= 2) { /* turb += snoise2(ns1+tp1*f,ns2+tp2*f) / f;*/ /* turb += pudn2(ns1+np1*nf2*f, ns2+np2*nf2*f,-1,1,nf2*f,nf2*f) / f;*/ turb += udn2(ns1+np1*nf2*f, ns2+np2*nf2*f,-1,1) / f; } val += turb * na; } else if(do_noiz>0.5) { /* float nf2 = (nf<1) ? 1 : nf; val += pudn2(ns1+np1*nf2, ns2+np2*nf2, -na, na, nf2, nf2); */ val += udn2(ns1+np1*nf, ns2+np2*nf, -na, na); } val = clamp(val, min, max); return val; } /************************************************************/ /* generate layer(s) of patterned shapes over color background much noise throughout */ /* one t_ means use st coords, tt_ means ss/tt, ttt_ means tile coords */ surface ubershader(float /* background params */ bg_x=.5, bg_y=.5, bg_z=.5, bg_space=.5, /* base color */ bg_x_n=.5, bg_y_n=.5, bg_z_n=.5, bg_x_na=.5, bg_y_na=.5, bg_z_na=.5, /* noise amp */ bg_x_nf=.5, bg_y_nf=.5, bg_z_nf=.5, /* noise freq */ bg_x_ns=.5, bg_y_ns=.5, bg_z_ns=.5, /* noise seed */ bg_x_t=.5, bg_y_t=.5, bg_z_t=.5, /* turn on/off */ bg_x_mf=.5, bg_y_mf=.5, bg_z_mf=.5; /* turb max freq */ /* tile shapes */ float t1_space=.5, t1_fuz=.5, t1_f_s=.5, t1_f_t=.5, t1_f=.5, /* tile freq */ t1_chance=.5, t1_shape=.5, t1_bomb=.5, /* jitter shape's position in tile */ ttt1_j_s=.5, ttt1_j_s_n=.5, ttt1_j_s_t=.5, ttt1_j_s_mf=.5, ttt1_j_s_ns=.5, ttt1_j_s_na=.5, ttt1_j_s_nf=.5, ttt1_j_t=.5, ttt1_j_t_n=.5, ttt1_j_t_t=.5, ttt1_j_t_mf=.5, ttt1_j_t_ns=.5, ttt1_j_t_na=.5, ttt1_j_t_nf=.5, tt1_j_s=.5, tt1_j_s_n=.5, tt1_j_s_t=.5, tt1_j_s_mf=.5, tt1_j_s_ns=.5, tt1_j_s_na=.5, tt1_j_s_nf=.5, tt1_j_t=.5, tt1_j_t_n=.5, tt1_j_t_t=.5, tt1_j_t_mf=.5, tt1_j_t_ns=.5, tt1_j_t_na=.5, tt1_j_t_nf=.5, t1_j_s=.5, t1_j_s_n=.5, t1_j_s_t=.5, t1_j_s_mf=.5, t1_j_s_ns=.5, t1_j_s_na=.5, t1_j_s_nf=.5, t1_j_t=.5, t1_j_t_n=.5, t1_j_t_t=.5, t1_j_t_mf=.5, t1_j_t_ns=.5, t1_j_t_na=.5, t1_j_t_nf=.5, /* rotate shapes, uniformly and/or w/noise */ t1_rot=.5, t1_rot1_a=.5, t1_rot_n=.5, t1_rot_ns=.5, t1_rot_na=.5, /* shape's color */ t1_x=.5, t1_y=.5, t1_z=.5, /* base color */ t1_x_n=.5, t1_y_n=.5, t1_z_n=.5, /* st noise? */ t1_x_na=.5, t1_y_na=.5, t1_z_na=.5, /* noise amp */ t1_x_nf=.5, t1_y_nf=.5, t1_z_nf=.5, /* noise freq */ t1_x_ns=.5, t1_y_ns=.5, t1_z_ns=.5, /* noise seed */ t1_x_t=.5, t1_y_t=.5, t1_z_t=.5, /* turn on/off */ t1_x_mf=.5, t1_y_mf=.5, t1_z_mf=.5, /* turb max freq */ tt1_x_n=.5, tt1_y_n=.5, tt1_z_n=.5, /* sstt noise? */ tt1_x_na=.5, tt1_y_na=.5, tt1_z_na=.5, /* noise amp */ tt1_x_nf=.5, tt1_y_nf=.5, tt1_z_nf=.5, /* noise freq */ tt1_x_ns=.5, tt1_y_ns=.5, tt1_z_ns=.5, /* noise seed */ tt1_x_t=.5, tt1_y_t=.5, tt1_z_t=.5, /* turn on/off */ tt1_x_mf=.5, tt1_y_mf=.5, tt1_z_mf=.5, /* turb max freq */ ttt1_x_n=.5, ttt1_y_n=.5, ttt1_z_n=.5, /* sstt noise? */ ttt1_x_na=.5, ttt1_y_na=.5, ttt1_z_na=.5, /* noise amp */ ttt1_x_nf=.5, ttt1_y_nf=.5, ttt1_z_nf=.5, /* noise freq */ ttt1_x_ns=.5, ttt1_y_ns=.5, ttt1_z_ns=.5, /* noise seed */ ttt1_x_t=.5, ttt1_y_t=.5, ttt1_z_t=.5, /* turn on/off */ ttt1_x_mf=.5, ttt1_y_mf=.5, ttt1_z_mf=.5; /* turb mx frq */ /* tile shapes */ float t2_space=.5, t2_fuz=.5, t2_f_s=.5, t2_f_t=.5, t2_f=.5, /* tile freq */ t2_chance=.5, t2_shape=.5, t2_bomb=.5, /* jitter shape's position in tile */ ttt2_j_s=.5, ttt2_j_s_n=.5, ttt2_j_s_t=.5, ttt2_j_s_mf=.5, ttt2_j_s_ns=.5, ttt2_j_s_na=.5, ttt2_j_s_nf=.5, ttt2_j_t=.5, ttt2_j_t_n=.5, ttt2_j_t_t=.5, ttt2_j_t_mf=.5, ttt2_j_t_ns=.5, ttt2_j_t_na=.5, ttt2_j_t_nf=.5, tt2_j_s=.5, tt2_j_s_n=.5, tt2_j_s_t=.5, tt2_j_s_mf=.5, tt2_j_s_ns=.5, tt2_j_s_na=.5, tt2_j_s_nf=.5, tt2_j_t=.5, tt2_j_t_n=.5, tt2_j_t_t=.5, tt2_j_t_mf=.5, tt2_j_t_ns=.5, tt2_j_t_na=.5, tt2_j_t_nf=.5, t2_j_s=.5, t2_j_s_n=.5, t2_j_s_t=.5, t2_j_s_mf=.5, t2_j_s_ns=.5, t2_j_s_na=.5, t2_j_s_nf=.5, t2_j_t=.5, t2_j_t_n=.5, t2_j_t_t=.5, t2_j_t_mf=.5, t2_j_t_ns=.5, t2_j_t_na=.5, t2_j_t_nf=.5, /* rotate shapes, uniformly and/or w/noise */ t2_rot=.5, t2_rot2_a=.5, t2_rot_n=.5, t2_rot_ns=.5, t2_rot_na=.5, /* shape's color */ t2_x=.5, t2_y=.5, t2_z=.5, /* base color */ t2_x_n=.5, t2_y_n=.5, t2_z_n=.5, /* st noise? */ t2_x_na=.5, t2_y_na=.5, t2_z_na=.5, /* noise amp */ t2_x_nf=.5, t2_y_nf=.5, t2_z_nf=.5, /* noise freq */ t2_x_ns=.5, t2_y_ns=.5, t2_z_ns=.5, /* noise seed */ t2_x_t=.5, t2_y_t=.5, t2_z_t=.5, /* turn on/off */ t2_x_mf=.5, t2_y_mf=.5, t2_z_mf=.5, /* turb max freq */ tt2_x_n=.5, tt2_y_n=.5, tt2_z_n=.5, /* sstt noise? */ tt2_x_na=.5, tt2_y_na=.5, tt2_z_na=.5, /* noise amp */ tt2_x_nf=.5, tt2_y_nf=.5, tt2_z_nf=.5, /* noise freq */ tt2_x_ns=.5, tt2_y_ns=.5, tt2_z_ns=.5, /* noise seed */ tt2_x_t=.5, tt2_y_t=.5, tt2_z_t=.5, /* turn on/off */ tt2_x_mf=.5, tt2_y_mf=.5, tt2_z_mf=.5, /* turb max freq */ ttt2_x_n=.5, ttt2_y_n=.5, ttt2_z_n=.5, /* sstt noise? */ ttt2_x_na=.5, ttt2_y_na=.5, ttt2_z_na=.5, /* noise amp */ ttt2_x_nf=.5, ttt2_y_nf=.5, ttt2_z_nf=.5, /* noise freq */ ttt2_x_ns=.5, ttt2_y_ns=.5, ttt2_z_ns=.5, /* noise seed */ ttt2_x_t=.5, ttt2_y_t=.5, ttt2_z_t=.5, /* turn on/off */ ttt2_x_mf=.5, ttt2_y_mf=.5, ttt2_z_mf=.5, /* turb mxfrq */ /* shape parameters */ pulse_width=.5, pulse_height=.5; ) { /************************************************************ * background ************************************************************/ color surface_color = 0; float x=.5, y=.5, z=.5; float bg_base_nf = 2; x = nfilt2(bg_x,0,1, bg_x_n, s, t , bg_x_ns*4083, bg_x_ns*1098, bg_x_nf, bg_x_na, bg_x_t, bg_x_mf*30); y = nfilt2(bg_y,0,1, bg_y_n, s,t,bg_y_ns*3830,bg_y_ns*8329,bg_y_nf,bg_y_na, bg_y_t, bg_y_mf*30); z = nfilt2(bg_z,0,1, bg_z_n, s,t,bg_z_ns*1009,bg_z_ns*3280,bg_z_nf,bg_z_na, bg_z_t, bg_z_mf*30); if(bg_space > 0.5) { surface_color = color "hsv" (x, y, z); } else { surface_color = color (x, y, z); } float ss, tt; float tmps, tmpt; float i, j; /************************************************************ * layer 1 tile shapes * ************************************************************/ float fuzz = .001 + t1_fuz / 2; float freq_s = 1 + t1_f_s * 7; float freq_t = (t1_f > 0.5) ? freq_s : 1 + t1_f_t * 7; float col = whichtile(s, freq_s); float row = whichtile(t, freq_t); color layer1_opac, layer1_color; for (i=-1; i<=1; i+=1) { for(j=-1; j<=1; j+=1) { float tmp_col = mod((col + i), freq_s); float tmp_row = mod((row + j), freq_t); /* mess up the shapes */ ss = repeat(s, freq_s) - i + nfilt2(0, -ttt1_j_s/2, ttt1_j_s/2, ttt1_j_s_n, tmp_col*10+.5, tmp_row*10+.5, ttt1_j_s_ns*9102, ttt1_j_s_ns*2910, 728.5, ttt1_j_s_na, 0, 0); tt = repeat(t, freq_t) - j + nfilt2(0, -ttt1_j_t/2, ttt1_j_t/2, ttt1_j_t_n, tmp_col*10+.5, tmp_row*10+.5, ttt1_j_t_ns*7184, ttt1_j_t_ns*7401, 728.5, ttt1_j_t_na, 0, 0); ss += nfilt2(0, -tt1_j_s/2, tt1_j_s/2, tt1_j_s_n, ss, tt, tt1_j_s_ns*8829, tt1_j_s_ns*9274, tt1_j_s_nf*2, tt1_j_s_na, tt1_j_s_t, tt1_j_s_mf*20); tt += nfilt2(0, -tt1_j_t/2, tt1_j_t/2, tt1_j_t_n, ss, tt, tt1_j_t_ns*8829, tt1_j_t_ns*9274, tt1_j_t_nf*2, tt1_j_t_na, tt1_j_t_t, tt1_j_t_mf*20); ss += nfilt2(0, -t1_j_s/2, t1_j_s/2, t1_j_s_n, s, t, t1_j_s_ns*1112, t1_j_s_ns*1839, t1_j_s_nf*2, t1_j_s_na, t1_j_s_t, t1_j_s_mf*20); tt += nfilt2(0, -t1_j_t/2, t1_j_t/2, t1_j_t_n, s, t, t1_j_t_ns*3810, t1_j_t_ns*8399, t1_j_t_nf*2, t1_j_t_na, t1_j_t_t, t1_j_t_mf*20); /* optionally rotate shapes */ tmps = ss; tmpt = tt; if(t1_rot>0.5) { float rot1_a = radians(360 * t1_rot1_a) + nfilt2(0, -3.14, 3.14, t1_rot_n, tmp_col*4987+.5, tmp_row*4731+.5, t1_rot_ns*9898, t1_rot_ns*3210, 987, t1_rot_na, 0, 0); rotate2d(tmps, tmpt, rot1_a, 0.5, 0.5, ss, tt); } /* float noi = pnoise(tmp_col*1843+.5,tmp_row*1419+.5,1843,1419); */ float noi = noise(tmp_col*1843+.5,tmp_row*1419+.5); /* if ((pudn(noi*8741, 0, 1, 8741) > t1_chance) || (t1_bomb>0.5)) { */ if ((udn(noi*8741, 0, 1) > t1_chance) || (t1_bomb>0.5)) { /* determine color of shape */ x=t1_x; y=t1_y; z=t1_z; x += nfilt2(0,-0.5,0.5, ttt1_x_n, tmp_col,tmp_row, ttt1_x_ns*7729,ttt1_x_ns*3134,ttt1_x_nf*.5,ttt1_x_na, ttt1_x_t, ttt1_x_mf*30); y += nfilt2(0,-0.5,0.5, ttt1_y_n, tmp_col,tmp_row, ttt1_y_ns*2892,ttt1_y_ns*4321,ttt1_y_nf,ttt1_y_na, ttt1_y_t, ttt1_y_mf*30); z += nfilt2(0,-0.5,0.5, ttt1_z_n, tmp_col,tmp_row, ttt1_z_ns*4200,ttt1_z_ns*9210,ttt1_z_nf,ttt1_z_na, ttt1_z_t, ttt1_z_mf*30); x += nfilt2(0,-0.5,0.5, t1_x_n, s,t,t1_x_ns*9210,t1_x_ns*2978,t1_x_nf*.5,t1_x_na, t1_x_t, t1_x_mf*30); y += nfilt2(0,-0.5,0.5, t1_y_n, s,t,t1_y_ns*4992,t1_y_ns*2072,t1_y_nf,t1_y_na, t1_y_t, t1_y_mf*30); z += nfilt2(0,-0.5,0.5, t1_z_n, s,t,t1_z_ns*1380,t1_z_ns*6739,t1_z_nf,t1_z_na, t1_z_t, t1_z_mf*30); x += nfilt2(0,-0.5,0.5, tt1_x_n, ss,tt,tt1_x_ns*2239,tt1_x_ns*8378, tt1_x_nf*.5,tt1_x_na, tt1_x_t, tt1_x_mf*30); y += nfilt2(0,-0.5,0.5, tt1_y_n, ss,tt,tt1_y_ns*4238,tt1_y_ns*1889, tt1_y_nf,tt1_y_na, tt1_y_t, tt1_y_mf*30); z += nfilt2(0,-0.5,0.5, tt1_z_n, ss,tt,tt1_z_ns*9188,tt1_z_ns*8391, tt1_z_nf,tt1_z_na, tt1_z_t, tt1_z_mf*30); if(t1_space>0.5) { layer1_color = color "hsv" (x,y,z); } else { layer1_color = color (x,y,z); } /* determine shape of shape */ point center = (0.5, 0.5, 0); /* location of center of disk */ float size1 = pulse_width/2+.25, size2 = pulse_height/2+.25; if(t1_shape<0.33) { /* disk */ float d = distance(center, point (ss, tt, 0)); layer1_opac = 1 - smoothstep(size1 - fuzz, size1, d); } else if(t1_shape<0.66) { float width = size1/(3 + pulse_height * 3); /* width of ring */ float d = distance(center, point (ss, tt, 0)); layer1_opac = pulse(size1 - width / 2, size1 + width / 2, fuzz, d); } else { /* rectangle */ layer1_opac = intersection(pulse(0.5-size1, 0.5+size1, fuzz, ss), pulse(0.5-size2, 0.5+size2, fuzz, tt)); } surface_color = blend(surface_color, layer1_color, layer1_opac); } } } /************************************************************ * layer 2 tile shapes * ************************************************************/ fuzz = .001 + t2_fuz / 2; freq_s = 1 + t2_f_s * 7; freq_t = (t2_f > 0.5) ? freq_s : 1 + t2_f_t * 7; col = whichtile(s, freq_s); row = whichtile(t, freq_t); color layer2_opac, layer2_color; for (i=-1; i<=1; i+=1) { for(j=-1; j<=1; j+=1) { float tmp_col = mod((col + i), freq_s); float tmp_row = mod((row + j), freq_t); /* mess up the shapes */ ss = repeat(s, freq_s) - i + nfilt2(0, -ttt2_j_s/2, ttt2_j_s/2, ttt2_j_s_n, tmp_col*10+.5, tmp_row*10+.5, ttt2_j_s_ns*9201, ttt2_j_s_ns*8397, 728.5, ttt2_j_s_na, 0, 0); tt = repeat(t, freq_t) - j + nfilt2(0, -ttt2_j_t/2, ttt2_j_t/2, ttt2_j_t_n, tmp_col*10+.5, tmp_row*10+.5, ttt2_j_t_ns*3047, ttt2_j_t_ns*1973, 728.5, ttt2_j_t_na, 0, 0); ss += nfilt2(0, -tt2_j_s/2, tt2_j_s/2, tt2_j_s_n, ss, tt, tt2_j_s_ns*7847, tt2_j_s_ns*1074, tt2_j_s_nf*2, tt2_j_s_na, tt2_j_s_t, tt2_j_s_mf*20); tt += nfilt2(0, -tt2_j_t/2, tt2_j_t/2, tt2_j_t_n, ss, tt, tt2_j_t_ns*9487, tt2_j_t_ns*4308, tt2_j_t_nf*2, tt2_j_t_na, tt2_j_t_t, tt2_j_t_mf*20); ss += nfilt2(0, -t2_j_s/2, t2_j_s/2, t2_j_s_n, s, t, t2_j_s_ns*3109, t2_j_s_ns*7309, t2_j_s_nf*2, t2_j_s_na, t2_j_s_t, t2_j_s_mf*20); tt += nfilt2(0, -t2_j_t/2, t2_j_t/2, t2_j_t_n, s, t, t2_j_t_ns*4110, t2_j_t_ns*4743, t2_j_t_nf*2, t2_j_t_na, t2_j_t_t, t2_j_t_mf*20); /* optionally rotate shapes */ tmps = ss; tmpt = tt; if(t2_rot>0.5) { float rot2_a = radians(360 * t2_rot2_a) + nfilt2(0, -3.14, 3.14, t2_rot_n, tmp_col*7842+.5, tmp_row*1387+.5, t2_rot_ns*3309, t2_rot_ns*3299, 987, t2_rot_na, 0, 0); rotate2d(tmps, tmpt, rot2_a, 0.5, 0.5, ss, tt); } float noi = pnoise(tmp_col*3412+.5,tmp_row*8781+.5,3412,8781); /* if ((pudn(noi*7848, 0, 1, 7848) > t2_chance) || (t2_bomb>0.5)) { */ if ((udn(noi*7848, 0, 1) > t2_chance) || (t2_bomb>0.5)) { /* determine color of shape */ x=t2_x; y=t2_y; z=t2_z; x += nfilt2(0,-0.5,0.5, ttt2_x_n, tmp_col,tmp_row, ttt2_x_ns*1748,ttt2_x_ns*7481,ttt2_x_nf*.5,ttt2_x_na, ttt2_x_t, ttt2_x_mf*30); y += nfilt2(0,-0.5,0.5, ttt2_y_n, tmp_col,tmp_row, ttt2_y_ns*4798,ttt2_y_ns*3284,ttt2_y_nf,ttt2_y_na, ttt2_y_t, ttt2_y_mf*30); z += nfilt2(0,-0.5,0.5, ttt2_z_n, tmp_col,tmp_row, ttt2_z_ns*2194,ttt2_z_ns*8716,ttt2_z_nf,ttt2_z_na, ttt2_z_t, ttt2_z_mf*30); x += nfilt2(0,-0.5,0.5, t2_x_n, s,t,t2_x_ns*1983,t2_x_ns*3281,t2_x_nf*.5,t2_x_na, t2_x_t, t2_x_mf*30); y += nfilt2(0,-0.5,0.5, t2_y_n, s,t,t2_y_ns*2187,t2_y_ns*4311,t2_y_nf,t2_y_na, t2_y_t, t2_y_mf*30); z += nfilt2(0,-0.5,0.5, t2_z_n, s,t,t2_z_ns*3843,t2_z_ns*1872,t2_z_nf,t2_z_na, t2_z_t, t2_z_mf*30); x += nfilt2(0,-0.5,0.5, tt2_x_n, ss,tt,tt2_x_ns*4100,tt2_x_ns*4782, tt2_x_nf*.5,tt2_x_na, tt2_x_t, tt2_x_mf*30); y += nfilt2(0,-0.5,0.5, tt2_y_n, ss,tt,tt2_y_ns*9410,tt2_y_ns*7384, tt2_y_nf,tt2_y_na, tt2_y_t, tt2_y_mf*30); z += nfilt2(0,-0.5,0.5, tt2_z_n, ss,tt,tt2_z_ns*6792,tt2_z_ns*4273, tt2_z_nf,tt2_z_na, tt2_z_t, tt2_z_mf*30); if(t2_space>0.5) { layer2_color = color "hsv" (x,y,z); } else { layer2_color = color (x,y,z); } /* determine shape of shape */ float size1 = pulse_width/2+.25, size2 = pulse_height/2+.25; point center = (0.5, 0.5, 0); /* location of center of disk */ if(t2_shape<0.33) { /* disk */ float d = distance(center, point (ss, tt, 0)); layer2_opac = 1 - smoothstep(size1 - fuzz, size1, d); } else if(t2_shape<0.66) { float width = size1/(3 + pulse_height * 3); /* width of ring */ float d = distance(center, point (ss, tt, 0)); layer2_opac = pulse(size1 - width / 2, size1 + width / 2, fuzz, d); } else { /* rectangle */ layer2_opac = intersection(pulse(0.5-size1, 0.5+size1, fuzz, ss), pulse(0.5-size2, 0.5+size2, fuzz, tt)); } surface_color = blend(surface_color, layer2_color, layer2_opac); } } } Ci = surface_color; normal Nf = faceforward (normalize(N),I); Ci *= diffuse(Nf); }