const int CurScene = 0x6; // Parameters from our host // x: Scene+Zeit // y: Hoehe // z: Aspec uniform vec3 Y; // All data of our world float cFac, CurTime, CurTime2, CurStep, pi2= 6.28319;//, CurScene; int m; vec2 CurNormal; vec3 cRes, rayDir, CurColor = vec3(0.), RayStep = vec3(0.); vec3 LightColor= vec3( 5., 4.5, 4.0); vec3 BackColor= vec3( 0.7, 0.9, 1.2); vec4 HitMaterial; vec2 rotate(vec2 v,float y) { return cos(y)*v+sin(y)*vec2(-v.y,v.x); } //repeat around y axis w times //void rp(inout vec3 p, float trans, float w) float repeatr(inout vec2 v,float x, float y) { float a= atan(v.y,v.x); float z=mod(a,y)-y*.5; v=(length(v))*vec2(cos(z),sin(z)); v.x-=x; return a-z; } void repeat( inout float w, float y ) { w= mod( w - y*.5, y ) - y*.5; } void repeate( inout float w, float y, float z ) { w= max( abs(w)-z, mod( w - y*.5, y ) - y*.5); } /*float row( float w, float y) { return floor( ( w - y*.5 )/ y ); }*/ //radius of the torus/ radius of the ring /*float torus(vec3 p,float f) { return length(vec2(length(p.xz) - f,p.y)); }*/ /*float signedDistToBox( vec3 p, vec3 b ) { vec3 di = abs(p) - b; float mc = maxcomp(di); return mc<0.0 ? mc : length(max(di,0.0)); }*/ float CBox( in vec3 p, in vec3 box, float rad ) { return length( max( abs(p) - box + vec3(rad), 0.0 ) ) - rad; } float CBox2D( in vec2 p, in vec2 box, float rad ) { return length( max( abs(p) - box + vec2(rad), 0.0 ) ) - rad; } /*float EndlessBar( vec2 p, float y, float z ) { return length( max( abs(p) - vec2(y) + vec2(z), 0.0 ) ) - z; }*/ /*float noise3D( vec3 p ) { return fract( sin( p.x * 151.0 + p.y * 33.0 + p.z ) * 11.0 ); } float smoothnoise(vec3 p) { vec2 e = vec2(1.0, 0.0); vec3 o= smoothstep(0.0,1.0,fract( p )); p= floor( p ); vec4 n= mix( vec4( noise3D( p+e.yyy),//n000, noise3D( p+e.xyy),//n100, noise3D( p+e.yxy),//n010, noise3D( p+e.xxy)),//n110), vec4( noise3D( p+e.yyx),//n001, noise3D( p+e.xyx),//n101, noise3D( p+e.yxx),//n011, noise3D( p+e.xxx)),//n111), o.z); e = mix(n.xy, n.zw, o.y); return mix(e.x, e.y, o.x); }*/ float plasm(float x, float a, float b,float c) { return sin(x+a+c*sin(x+b)); } float smin( float a, float b, float k ) { float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 ); return mix( b, a, h ) - k*h*(1.0-h); } float hash( vec2 p ) { float h = dot(p,vec2(23.2,15.7)); return fract(sin(h)*232.45); } float noise(vec2 p) { vec2 e = vec2(1.0, 0.0); vec2 i = floor( p ); vec2 f = fract( p ); f *= f*(3.0-2.0*f); return -0.5 + mix( mix( hash( i + e.yy ), hash( i + e.xy ), f.x), mix( hash( i + e.yx ), hash( i + e.xx ), f.x), f.y); } float wHeight() { if (CurScene > 9) { return -22.0; } else if (CurScene == 9) { return 11.0 - CurTime * 33.0; } else { return min( 11.0, -33.0 + 22.0 * Y.x - CurScene * 11.0); } return 11.0 - CurTime * 33.0; } float wdings(vec3 p, float t) { p.y -= wHeight(); p.xy= rotate( p.xy, 2.3 * t ); p.yz= rotate( p.yz, 1.9 * t ); repeate(p.x, 10.0, 10.0); repeate(p.y, 10.0, 10.0); repeate(p.z, 10.0, 10.0); vec2 e = vec2(6.0, 0.5); float b = min(min(CBox(p, e.xyy, 0.2), CBox(p, e.yxy, 0.2)), CBox(p, e.yyx, 0.2)); return smin(length(p) - 3.0, b, 1.0); } float f0(vec3 p) { float w = wdings(p, CurTime - 0.02); float d = rayDir.y < 0. ? (p.y + 0.3)/rayDir.y : 999.0; d= smin (max(p.y, d), p.y + w - 2.0, 2.0); if (CurScene > 9) { float Walk = (Y.x - 10.1) * 444.0; Walk = smoothstep( Walk - 166., Walk - 66.0, length(p.xz)); d = p.y - Walk * 33.0 + 33. + 3.0 * (1.0 - Walk) * sin(length(p.xz) * 0.1 - CurTime * 66.0); } if (d > 0.5) { return d; } p *= 0.4; p.x += CurTime; return d + abs (0.2 * noise(p.xz)); } float f0N(vec3 p) { float d = f0(p); if (d > 0.5) { return d; } p /= 0.1; p.x += CurTime; d += abs (0.005 * noise(p.xz)); p.x += CurTime; d += abs (0.01 * noise(p.xz)); p /= 2.8; p.x += CurTime; d += abs (0.02 * noise(p.xz)); p /= 2.8; p.x += CurTime; d += abs (0.04 * noise(p.xz)); return d; } float f1(vec3 p) { return wdings(p, CurTime); } float f2(vec3 p) { vec3 o = p; float b = length(o.xz) * 0.2; o.y -= 5.0 * b - 0.2 * b * b - 30.0; //repeate(o.y, 8.0, 16.0); repeatr(o.zx, 172.0 * Y.x - 1899.0, pi2 / 48.0); //o.z += 5.0 * hash(d); repeate(o.z, 44.0, 88.0); repeate(o.z, 4.0, 4.0); o.z = length(o.z) - 0.7; b = (o.z < 0.0 ? length( o.xy ): length( o )) - 1.0; o = p; o.y -= wHeight(); o.xy= rotate( o.xy, 2.3 * CurTime ); o.yz= rotate( o.yz, 1.9 * CurTime ); float a = max( max( CBox(o, vec3(11.0,11.0,11.0), 1.0), 1.0 - wdings(p, CurTime)), length(o) - 6.0 * (Y.x - 6.2)) - plasm(0.3 * p.x, 8.0 * CurTime, 0.3 * p.y, sin(0.3 *p.z)); a *= 0.5; if(CurScene > 9) return smin(a, b, 16.0); else if(CurScene > 8) return a; else { //float r = min(1.0, 1.0 + p.z + min( 0.0, Y.x * 44.0 - 377.0)); float r = -min(-5.0, Y.x * 88.0 - 555.0) - p.z; r = 1. - (r < 0. ? 0. : 0.04 * r * r); p.x -= plasm(p.z * 0.3, 0.5, CurTime, 0.4); p.y -= 5.0 + plasm(p.z * 0.2, CurTime, 0.0, 1.2 + sin(CurTime)); return smin( a, CBox2D(p.xy, vec2(r * 0.4, r), r * 0.4), 8.0); } } float f3(vec3 p) { repeatr(p.zx, 88.0, pi2 / 6.0); repeatr(p.zx, 33.0, pi2 / 12.0); float d = length(p.x); return max(p.z - d + pow(d, 1.1), p.y - 44.0); } float f(vec3 p) { return min( min( min( f0(p), f1(p) ), f2(p) ), f3(p) ); } float fN(vec3 p) { return min( min( min(f0N(p), f1(p) ), f2(p) ), f3(p) ); } void mat(vec3 p) { float z= 0.1; if( z > f1(p) ) { z= f1(p); HitMaterial = vec4(-2.0, 3.0, 0.7, 1.1); CurColor = vec3(1.0,1.5,1.8 ); CurStep= .1; } if( z > f2(p) ) { z= f2(p); HitMaterial = vec4(-2.0, 0.8, 0.5, 1.2); CurColor = vec3(1.8,1.0,0.2); CurStep= 0.1; } if( z > f3(p) ) { z= f3(p); HitMaterial = vec4(-1.0, 3., 0.8, 1.2); CurColor = vec3(.3,.2,.5); CurStep= .8; } if( z > f0(p) ) { HitMaterial = vec4(-1.0, 9.0, 0.95, 1.0); CurColor = vec3(.0,.0,.0 ); CurStep= 0.6; } } /*void ToRes(vec3 Color, float Factor) { cRes+= Color * cFac; cFac*= Factor; }*/ vec3 lightSphere(vec3 normal, vec3 color, vec2 desc) { return smoothstep(desc.x, desc.y, dot(vec3( 0.86, 0.5, 0.0),normal)) * color; } void main() { //Z = (gl_FragCoord.xy / Y.zw) * vec2(Y.z/Y.w, 1); CurTime= fract(Y.x); //CurScene= Y.x - fract(Y.x); CurTime2= CurTime * CurTime; // Get the look direction for the current pixel (always look forwards) rayDir = vec3((gl_FragCoord.xy / Y.y - 0.5), 0.8); rayDir.x -= Y.z; //Kamera sitzt an dieser Position vec3 p = vec3( 0.0, 11.0, -CurTime * 33.0); if( CurScene < 1) { rayDir.yz= rotate( rayDir.yz, 1.5 - 2.0 * CurTime ); rayDir.xz= rotate( rayDir.xz, 4.0 + CurTime); } else if( CurScene < 2) { p = vec3( -33.0, 6.0, -3.0); rayDir.yz= rotate( rayDir.yz, 0.2 ); rayDir.xz= rotate( rayDir.xz, 4.4 ); } else if( CurScene < 3 ) { p = vec3( 0.0, 6.0, -22.0); rayDir.yz= rotate( rayDir.yz, 0.4 - 0.6 *CurTime ); //rayDir.xz= rotate( rayDir.xz, 0.0 ); } else if( CurScene < 4 ) { p = vec3( -44.0, 8.0, -40.0); rayDir.yz= rotate( rayDir.yz, 0.0 ); rayDir.xz= rotate( rayDir.xz, 4.5 + CurTime ); } else if( CurScene < 5 ) { ////////////// Shader 1 p= vec3( 11.0, 66.* (1.0 - CurTime * 0.7), 190.); rayDir.yz= rotate( rayDir.yz, 1.0 * (1.0 - CurTime * 0.5) ); rayDir.xz= rotate( rayDir.xz, 3.0 ); //CurTime2 = CurTime; } /*else if( CurScene < 6 ) { p= vec3( -22.0, 11., 150.* (1.0 - CurTime * 0.1)); rayDir.yz= rotate( rayDir.yz, 0.2 ); rayDir.xz= rotate( rayDir.xz, 4.0 ); //CurTime2 = CurTime; }*/ else if( CurScene < 6 ) { p= vec3( 11.0, 9.0, 111.* (1.0 - CurTime * 0.1)); rayDir.yz= rotate( rayDir.yz, 0.3 ); rayDir.xz= rotate( rayDir.xz, 2.0 + CurTime * 0.8 ); } /*else if( CurScene < 8 ) { p= vec3( -33.0, 7.0, 0.); rayDir.yz= rotate( rayDir.yz, 0.0 ); rayDir.xz= rotate( rayDir.xz, 5.0); }*/ else if( CurScene < 7 ) { ////////////// Shader 2 p= vec3( 11.0, 33.* (1.0 - CurTime * 0.1), 11.); rayDir.yz= rotate( rayDir.yz, 1.0); rayDir.xz= rotate( rayDir.xz, 2.0 ); } else if( CurScene < 8 ) { p = vec3( -22.0, 6.0, 22.0); rayDir.yz= rotate( rayDir.yz, -0.2 ); rayDir.xz= rotate( rayDir.xz, 4.2 ); } else if( CurScene < 9 ) { p= vec3( 11.0, 66.* (1.0 - CurTime * 0.3), 22.); rayDir.yz= rotate( rayDir.yz, 1.0); rayDir.xz= rotate( rayDir.xz, 3.0 ); } else if( CurScene < 10 ) { p = vec3( -22.0, 8.0, -22.0); rayDir.yz= rotate( rayDir.yz, CurTime * 0.4 - 0.3 ); rayDir.xz= rotate( rayDir.xz, 5.3 ); } else if( CurScene < 11 ) { ////////////// Shader 3 p= vec3( -66., 60.0, 22.0); rayDir.yz= rotate( rayDir.yz, 0.6 ); rayDir.xz= rotate( rayDir.xz, 4.4 ); //CurTime = CurTime * 8.0 + 0.6; //CurTime2 = mod( CurTime, 1.0); } else //if( CurScene < 12 ) { p= vec3( -33., 22.0 * (1.0-CurTime), 11.0); rayDir.yz= rotate( rayDir.yz, 0.5 ); rayDir.xz= rotate( rayDir.xz, 5.0 ); } /*else if( CurScene < 15 ) { p= vec3( -99.0 * (1.0 - CurTime * 3.3), 88.0, -44.0); rayDir.yz= rotate( rayDir.yz, 0.6 + CurTime ); rayDir.xz= rotate( rayDir.xz, 2.5 ); CurTime = CurTime * 8.0 + 0.6; CurTime2 = mod( CurTime, 1.0); } else if( CurScene < 16 ) { p= vec3( -99.0 * (1.0 - CurTime * 0.8 ), 12.0, 99.0); //rayDir.yz= rotate( rayDir.yz, 0.6 + CurTime ); rayDir.xz= rotate( rayDir.xz, 4.5 ); CurTime = CurTime * 8.0 + 0.6; CurTime2 = mod( CurTime, 1.0); }*/ //CurScene= Y.x - fract(Y.x); rayDir = normalize(rayDir); cRes= vec3( .0,.0,.0 ); cFac=1.0; //float t=smoothnoise( rayDir*666.0 )*0.1,y,z; //float t= 0.5 * plasm(999. * rayDir.x, 999. * rayDir.z, 999. * rayDir.y,999. * rayDir.z),y,z; float t= 0.0,y,z; m=0; HitMaterial = vec4(-3.0, 8.0, 0.98, 1.0); vec3 fog = lightSphere(rayDir, LightColor, HitMaterial.zw);// + //lightSphere(rayDir, BackColor, HitMaterial.xy); while(m++<2) { //bis zu einer Oberflaeche steppen //for (CurStep=1.0;t<999.0 && CurStep>t*.003;t+=0.01+max(0.0, CurStep),RayStep=rayDir*t ) float ii = 80.0; for (CurStep=1.0;ii >=0.0 && t<999.0 && CurStep>t*.001;t+=CurStep,RayStep=rayDir*t,--ii ) { CurStep = f(p+RayStep); } if (ii <= 1) { ii = 0.; t = 999.3 ; RayStep=rayDir*t; break; } ii = smoothstep(44., 1., ii); vec3 NextPos = p+RayStep; //Startpunkt und Richtung fuer reflektierten Strahl; p= NextPos; CurNormal = vec2(0.04, 0.0); vec3 n= vec3( fN(p + CurNormal.xyy) - fN(p - CurNormal.xyy), fN(p + CurNormal.yxy) - fN(p - CurNormal.yxy), fN(p + CurNormal.yyx) - fN(p - CurNormal.yyx) ); // float gradlen = length(n / (2 * CurNormal.x)); // float error = abs(gradlen - 1.0); // gl_FragColor.xyz = mix(vec3(0.0, 1.0, 0.0), vec3(1.0, 0.0, 0.0), error); // return; //CurNormal = vec2(0.0, 0.0); mat(p); //n.xz += CurNormal; n= normalize(n); //CurStep ab hier == Reflektion !!! if( t > 999.0) { if( m < 2) { HitMaterial = vec4(-3.0, 8.0, 0.98, 1.0); } break; } rayDir= reflect( rayDir, n ); //float ao(vec3 p, vec3 n, float d, float i) { y= 8.0; for (z=1.0;y>0.;y--) { z-=.5*(y-f(p+n*y))/exp2(y); } CurColor*= z; CurColor*= lightSphere(rayDir, BackColor, HitMaterial.xy); cRes+= cFac*mix(CurColor, fog, ii);//*(1.0-Reflect); cFac*= CurStep;// Reflect * (1.0-t/tmax); t= 0.5; RayStep = rayDir * t; } gl_FragColor.xyz = smoothstep(11.92, 11.8, Y.x) * (cRes + cFac* ( lightSphere(rayDir, LightColor, HitMaterial.zw) + lightSphere(rayDir, BackColor, HitMaterial.xy))); //gl_FragColor.xyz = smoothstep(-12.0, -11.8, -Y.x) * mix((cRes + cFac* // ( lightSphere(rayDir, LightColor, HitMaterial.zw) + // lightSphere(rayDir, BackColor, HitMaterial.xy))), fog, fogAmount / 2.0); }