/
Created by soma_arc, Kazushi Ahara - 2015
This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported.
/
// from Syntopia http://blog.hvidtfeldts.net/index.php/2015/01/path-tracing-3d-fractals/
vec2 rand2n(vec2 co, float sampleIndex) {
vec2 seed = co (sampleIndex + 1.0);
seed+=vec2(-1,1);
// implementation based on: lumina.sourceforge.net/Tutorials/Noise.html
return vec2(fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) 43758.54530.),/1./
fract(cos(dot(seed.xy ,vec2(4.898,7.23))) 23421.6310.));/1.*/
}
/
โ
๐ฃ โช๐ขโช๐โช๐ขโช๐ฃ
โฆเญฆโฆโฏโฆเญฆโฆโ โฏโโฏโโฏโโฏโ โฆเญฆโฆโฏโฆเญฆโฆ
๐ฃ โช๐ขโช๐โช๐ขโช๐ฃ
๐ขแฏฝ๐ขโ๐ขแฏฝ๐ข
๐ฃ โช๐ขโช๐โช๐ขโช๐ฃ
โฆเญฆโฆโฏโฆเญฆโฆโ โฏโโฏโโฏโโฏโ โฆเญฆโฆโฏโฆเญฆโฆ
๐ฃ โช๐ขโช๐โช๐ขโช๐ฃ
โ
/
/ ยทโนยท /
const vec2 C01P = vec2(0.,(1.+1./sqrt(2.)));
const float C01R = (1./2.+sqrt(2.)/2.);
const vec2 C02P = vec2(0.,-(1.+1./sqrt(2.)));
const float C02R = (1./2.+sqrt(2.)/2.);
const vec2 C03P = vec2((1.+1./sqrt(2.)),0.);
const float C03R = (1./2.+sqrt(2.)/2.);
const vec2 C04P = vec2(-(1.+1./sqrt(2.)),0.);
const float C04R = (1./2.+sqrt(2.)/2.);
/ ยทโนยท /
/ ๊โน๊ /
const vec2 C001P = vec2((1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.)));
const float C001R = sqrt(2.)/7.-1./14.;
const vec2 C002P = vec2(-(1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.)));
const float C002R = sqrt(2.)/7.-1./14.;
const vec2 C003P = vec2((1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.)));
const float C003R = sqrt(2.)/7.-1./14.;
const vec2 C004P = vec2(-(1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.)));
const float C004R = sqrt(2.)/7.-1./14.;
/ ๊โน๊ /
const vec2 C0P = vec2(0.,0.);
const float C0R = .5*(3.-sqrt(8.));
/ โต /
const vec2 C1P = vec2(0.,0.);
const float C1R = .5*(3.-sqrt(8.))/(3.-sqrt(8.));
const vec2 C2P = vec2(0.,.5(2.-sqrt(2.)));
const float C2R = .5(sqrt(2.)-1.);
const vec2 C3P = vec2(0.,.5-(2.-sqrt(2.)));
const float C3R = .5(sqrt(2.)-1.);
const vec2 C4P = vec2(.5-(2.-sqrt(2.)),0.);
const float C4R = .5(sqrt(2.)-1.);
const vec2 C5P = vec2(.5(2.-sqrt(2.)),0.);
const float C5R = .5(sqrt(2.)-1.);
/ โต /
/ ยท /
const vec2 C6P = vec2((1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.)));
const float C6R = (sqrt(2.)/7.-1./14.);
const vec2 C7P = vec2(-(1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.)));
const float C7R = (sqrt(2.)/7.-1./14.);
const vec2 C8P = vec2((1./(3.sqrt(2.)-2.)),-(1./(3.sqrt(2.)-2.)));
const float C8R = (sqrt(2.)/7.-1./14.);
const vec2 C9P = vec2(-(1./(3.sqrt(2.)-2.)),(1./(3.sqrt(2.)-2.)));
const float C9R = (sqrt(2.)/7.-1./14.);
/ ยท /
vec2 circleInverse(vec2 pos, vec2 circlePos, float circleR){
return ((pos - circlePos) circleR circleR)/(length(pos - circlePos) * length(pos - circlePos) ) + circlePos;
}
const int ITERATIONS =19683;
float IIS(vec2 pos){
float loopNum = 0.;
bool cont = false;
for(int i = 0 ; i < ITERATIONS ; i++){
cont = false;
//if(distance(pos, C0P) < C0R){
//pos = circleInverse(pos, C0P, C0R);
//cont = true;
//loopNum++;
if(distance(pos, C01P) < C01R){
pos = circleInverse(pos, C01P, C01R);
cont = true;
loopNum++;
}else if(distance(pos, C02P) < C02R){
pos = circleInverse(pos, C02P, C02R);
cont = true;
loopNum++;
}else if(distance(pos, C03P) < C03R){
pos = circleInverse(pos, C03P, C03R);
cont = true;
loopNum++;
}else if(distance(pos, C04P) < C04R){
pos = circleInverse(pos, C04P, C04R);
cont = true;
loopNum++;
//}else if(distance(pos, C001P) < C001R){
//pos = circleInverse(pos, C001P, C001R);
//cont = true;
//loopNum++;
//}else if(distance(pos, C002P) < C002R){
//pos = circleInverse(pos, C002P, C002R);
//cont = true;
//loopNum++;
//}else if(distance(pos, C003P) < C003R){
//pos = circleInverse(pos, C003P, C003R);
//cont = true;
//loopNum++;
//}else if(distance(pos, C004P) < C004R){
//pos = circleInverse(pos, C004P, C004R);
//cont = true;
//loopNum++;
}else if(distance(pos, C1P) < C1R){
pos = circleInverse(pos, C1P, C1R);
cont = true;
loopNum++;
//}else if(distance(pos, C2P) < C2R){
//pos = circleInverse(pos, C2P, C2R);
//cont = true;
//loopNum++;
//}else if(distance(pos, C3P) < C3R){
//pos = circleInverse(pos, C3P, C3R);
//cont = true;
//loopNum++;
//}else if(distance(pos, C4P) < C4R){
//pos = circleInverse(pos, C4P, C4R);
//cont = true;
//loopNum++;
//}else if(distance(pos, C5P) < C5R){
//pos = circleInverse(pos, C5P, C5R);
//cont = true;
//loopNum++;
}else if(distance(pos, C6P) < C6R){
pos = circleInverse(pos, C6P, C6R);
cont = true;
loopNum++;
}else if(distance(pos, C7P) < C7R){
pos = circleInverse(pos, C7P, C7R);
cont = true;
loopNum++;
}else if(distance(pos, C8P) < C8R){
pos = circleInverse(pos, C8P, C8R);
cont = true;
loopNum++;
}else if(distance(pos, C9P) < C9R){
pos = circleInverse(pos, C9P, C9R);
cont = true;
loopNum++;
}
if(cont == false) break;
}
return loopNum;
}
vec3 hsv2rgb(vec3 c)
{
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
vec3 p = abs(fract(c.xxx + K.xyz) 2. - K.www);
return c.z mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}
const float SAMPLE_NUM =1.;/243/
void mainImage( out vec4 fragColor, in vec2 fragCoord ){
vec3 sum = vec3(0);
float ratio = iResolution.x / iResolution.y / 2.0;
for(float i = 0. ; i < SAMPLE_NUM ; i++){
vec2 position = ((fragCoord.xy + rand2n(fragCoord.xy, i)) / iResolution.yy) - vec2(ratio, 0.5);
position *= 1.;
if (distance(position, vec2(0.0)) > .5) {
sum += vec3(1.0);
continue;
}
// -----------------------------------
float loopNum = IIS(position);
if (loopNum > 0.) {
sum += vec3(mod(floor(1.-loopNum), 2.));
/sum += hsv2rgb(vec3(0.0 iTime / 1.0 + .5 loopNum, 1.,1.));/
} else {
sum += vec3(0.,.958,.487);
}
}
fragColor = vec4(sum / SAMPLE_NUM, 1.0);
}