Gallery

fractal pyramid

Live parameters

Geometry
8
0.50
Motion
1.00
Color
0.000
1.00
GLSL source
#ifndef ITERATIONS
#define ITERATIONS 8
#endif
#ifndef FOLD_SCALE
#define FOLD_SCALE 0.5
#endif
#ifndef TIME_SCALE
#define TIME_SCALE 1.0
#endif
#ifndef HUE_SHIFT
#define HUE_SHIFT 0.0
#endif
#ifndef BRIGHTNESS
#define BRIGHTNESS 1.0
#endif
#ifndef PALETTE_A
#define PALETTE_A vec3(0.2,0.7,0.9)
#endif
#ifndef PALETTE_B
#define PALETTE_B vec3(1.,0.,1.)
#endif

vec3 hueShift(vec3 c, float h){
    const vec3 k = vec3(0.57735);
    float ch = cos(h * 6.2831853);
    float sh = sin(h * 6.2831853);
    return c * ch + cross(k, c) * sh + k * dot(k, c) * (1.0 - ch);
}

vec3 palette(float d){
	return mix(PALETTE_A, PALETTE_B, d);
}

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

float map(vec3 p){
    for( int i = 0; i<ITERATIONS; ++i){
        float t = iTime*0.2*TIME_SCALE;
        p.xz =rotate(p.xz,t);
        p.xy =rotate(p.xy,t*1.89);
        p.xz = abs(p.xz);
        p.xz-=FOLD_SCALE;
	}
	return dot(sign(p),p)/5.;
}

vec4 rm (vec3 ro, vec3 rd){
    float t = 0.;
    vec3 col = vec3(0.);
    float d;
    for(float i =0.; i<64.; i++){
		vec3 p = ro + rd*t;
        d = map(p)*.5;
        if(d<0.02){
            break;
        }
        if(d>100.){
        	break;
        }
        //col+=vec3(0.6,0.8,0.8)/(400.*(d));
        col+=palette(length(p)*.1)/(400.*(d));
        t+=d;
    }
    return vec4(col,1./(d*100.));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = (fragCoord-(iResolution.xy/2.))/iResolution.x;
	vec3 ro = vec3(0.,0.,-50.);
    ro.xz = rotate(ro.xz,iTime*TIME_SCALE);
    vec3 cf = normalize(-ro);
    vec3 cs = normalize(cross(cf,vec3(0.,1.,0.)));
    vec3 cu = normalize(cross(cf,cs));
    
    vec3 uuv = ro+cf*3. + uv.x*cs + uv.y*cu;
    
    vec3 rd = normalize(uuv-ro);
    
    vec4 col = rm(ro,rd);
    col.rgb = hueShift(col.rgb, HUE_SHIFT) * BRIGHTNESS;

    fragColor = col;
}

/** SHADERDATA
{
	"title": "fractal pyramid",
	"description": "",
	"model": "car"
}
*/