#version 400 //the following uniform values are set by Visions of Chaos prior to shader execution uniform vec2 resolution; uniform vec3 palette[256]; uniform double xmin; uniform double xmax; uniform double ymin; uniform double ymax; uniform double bailout; uniform int maxiters; uniform int samplepixels; double sqrsamplepixels=double(samplepixels*samplepixels); double bailout_squared=double(bailout*bailout); double magnitude=0.0,r1,r2,g1,g2,b1,b2,tweenval; float realiters; vec4 finalcol,col; int superx,supery; double stepx=(xmax-xmin)/resolution.x/double(samplepixels); double stepy=(ymax-ymin)/resolution.y/double(samplepixels); int index,colval,colval2; dvec2 z,c; double trapmin,trapmax,trapdist,trapx,trapy,distpercentage; bool trapped; void main(void) { //center of trap trapx=0; trapy=0.5; //rings trap sizes trapmin=0.4; trapmax=0.5; finalcol=vec4(0,0,0,0); for (supery=0;superybailout_squared) break; z.x = x; z.y = y; //rings orbit traps trapdist=sqrt((z.x-trapy)*(z.x-trapy)+(z.y-trapx)*(z.y-trapx)); if ((trapdisttrapmin)) { trapped=true; } if (trapped==true) break; } //trapped? if (trapped==true) { distpercentage=(trapdist-trapmin)/(trapmax-trapmin); if (distpercentage>0.5) { distpercentage=0.5-(distpercentage-0.5); } distpercentage=distpercentage*2; col=vec4(distpercentage,distpercentage,distpercentage,1); } else if (i==maxiters) { col=vec4(0.0,0.0,0.0,1.0); } else { //CPM smooth colors //note that double precision does not support log so it needs to be cast as float realiters=float(i+1-((log(log(sqrt(float(magnitude))))/log(2.0)))); colval=int(mod(realiters,255)); colval2=int(mod(colval+1,255)); tweenval=realiters-int(realiters); r1=palette[colval].r; g1=palette[colval].g; b1=palette[colval].b; r2=palette[colval2].r; g2=palette[colval2].g; b2=palette[colval2].b; col=vec4(r1+((r2-r1)*tweenval),g1+((g2-g1)*tweenval),b1+((b2-b1)*tweenval),1.0); } finalcol+=col; } } gl_FragColor = vec4(finalcol/double(sqrsamplepixels)); }