606 lines
14 KiB
GLSL
606 lines
14 KiB
GLSL
const int shader= 0;
|
|
|
|
@D
|
|
//#version 430
|
|
@@
|
|
|
|
// Parameters from our host
|
|
// x: Scene
|
|
// y: Zeit
|
|
// z: Breite
|
|
// w: Hoehe
|
|
uniform vec4 Y;
|
|
|
|
// Position of the fragment
|
|
//vec2 Z;
|
|
|
|
// All data of our world
|
|
float cFac, CurTime, CurTime2, CurScene, CurStep, pi2= 6.28319;
|
|
int m;
|
|
vec2 CurNormal;
|
|
vec3 cRes, CurColor = vec3(0.), RayStep = vec3(0.);
|
|
vec3 LightColor= vec3( 8., 4., 2.0);
|
|
vec3 BackColor= vec3( 0.7, 1.0, 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 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 f0(vec3 p)
|
|
{
|
|
if( shader == 0 )
|
|
{
|
|
float d = length(p) - 24.0 - plasm(0.3 * p.x, 8.0 * CurTime, 0.3 * p.y, sin(0.3 *p.z));
|
|
if (CurScene == 2.)
|
|
{
|
|
return 999.;
|
|
}
|
|
else if (CurScene < 4.)
|
|
{
|
|
return d;
|
|
}
|
|
else
|
|
{
|
|
p.x += sin(4.0 * CurTime2 + 0.2 * p.y);
|
|
p.z += sin(0.3 * p.y);
|
|
return 0.8 * smin (max(p.y, length (p.xz) - 4.0 - plasm(0.0, 0. + 0.2 * p.y, 0.5 * p.x, 0.3 * p.z) + 11.0 * smoothstep(11.0,-11.0, p.y + 222.0 * CurTime2)),
|
|
d,
|
|
11.0);
|
|
}
|
|
}
|
|
else if( shader == 1 )
|
|
{
|
|
vec3 o = p;
|
|
o.x += sin(4.0 * CurTime + 0.2 * o.y);
|
|
o.z += sin(0.3 * o.y);
|
|
|
|
p.y -= 11. - 6.0 * smoothstep( -22.0, 0.0, p.x);
|
|
repeat(p.y, 88.);
|
|
float d = p.x;
|
|
p.x -= 77.0 * CurTime;
|
|
p.yz = rotate(p.yz, cos((0.3 * d )) + 4.0 * CurTime * cos(77.0 * row(p.x, 6.)));
|
|
repeat(p.x, 6.);
|
|
p.y -= 1.0;
|
|
|
|
return smin( max( length(p) - 1.0, d),
|
|
length (o.xz) - 6.0 - plasm(0.0, 0. + 0.2 * o.y, 0.5 * o.x, 0.3 * o.z),
|
|
4.0);
|
|
}
|
|
else
|
|
{
|
|
float d = p.x;
|
|
p.x -= 77. * smoothstep( 0.0, 0.6 , CurTime2);
|
|
d = plasm(16.0 * CurTime, 0.3 * p.y, 0.3 * p.z, sin(0.3 *p.x)) * smoothstep( 34.0, 33.0, d);
|
|
if( plasm(16.0, 0.3, row(p.z, 99.), row(p.x, 77.) - (CurTime-CurTime2)) > 0.8)
|
|
{
|
|
d += 8.0;
|
|
}
|
|
repeat(p.z, 99.);
|
|
repeat(p.x, 77.);
|
|
return torus(p, 22.0) - 6.0 + d;
|
|
}
|
|
}
|
|
|
|
float f1(vec3 p)
|
|
{
|
|
if( shader == 0 )
|
|
{
|
|
if (CurScene < 2.)
|
|
{
|
|
return 999.;
|
|
}
|
|
p.xz = rotate(p.xz, 2.0 * CurTime2);
|
|
repeatr(p.xz, 44.0, pi2 / 5.0);
|
|
p.y += 77. - CurTime2 * 22.0;
|
|
p.xy = rotate(p.xy, -CurTime2);
|
|
vec3 o = p;
|
|
o.y-= 17.0;
|
|
o.x-= 38.0;
|
|
o.xy = rotate(o.xy, 0.4);
|
|
float d = -o.y;
|
|
o.y += 83.0;
|
|
return max( d, length(o) - 88.);
|
|
}
|
|
else if( shader == 1 )
|
|
{
|
|
p.xz = rotate(p.xz, 11.0 * sin(99.0 *row(p.y, 22.)) + 4.0 * CurTime * cos(66.0 * row(p.y, 22.)));
|
|
repeat(p.y, 22.);
|
|
float e = length(p.xz) - 22.0;
|
|
p.z -= 44.0;
|
|
float d = length( max(vec2(abs(p.y)- 2.7, 58.0 - length(p.xz)), 0.0)) - 2.0;
|
|
return max(d, e);
|
|
}
|
|
else
|
|
{
|
|
repeat(p.z, 99.);
|
|
p.x -= 77. * smoothstep( 0.0, 0.6, CurTime2) - 77. * smoothstep( 0.6, 0.9, CurTime2);
|
|
p.y -= 22. * smoothstep( 0.5, 0.7, CurTime2) - 22. * smoothstep( 0.9, 1.0, CurTime2);
|
|
//repeat(p.x, 77.);
|
|
p.y -= 4.0;
|
|
float d = CBox(p, vec3(33.0, 7.0, 33.0), 3.0);
|
|
repeatr(p.zx, 11.0, pi2 / 2.0);
|
|
p.y -= 11.0;
|
|
return smin( d, CBox(p, vec3(22.0, 22.0, 8.0), 8.), 8.0);
|
|
}
|
|
}
|
|
|
|
float f2(vec3 p)
|
|
{
|
|
//p.xz = rotate(p.xz, p.y/8. );
|
|
//repeatr(p.xz, 8.0, pi2 / 3.0);
|
|
if( shader == 0 )
|
|
{
|
|
if (CurScene < 2.)
|
|
{
|
|
return 999.;
|
|
}
|
|
p.xz = rotate(p.xz, 2.0 * CurTime2);
|
|
repeatr(p.xz, 44.0, pi2 / 5.0);
|
|
p.y += 77. - CurTime2 * 22.0;
|
|
p.xy = rotate(p.xy, -CurTime2);
|
|
vec3 o = p;
|
|
o.y-= 17.0;
|
|
o.x-= 38.0;
|
|
o.xy = rotate(o.xy, 0.4);
|
|
float d = max(max(o.y, length(o) - 31.0), min(abs(o.z), (-o.y)) - 2.0);
|
|
p.z = abs(p.z) - 8.0;
|
|
return min( d, CBox( p, vec3(33.,8.0 - 0.1 * p.x ,4.), 2.));
|
|
}
|
|
else if( shader == 1 )
|
|
{
|
|
p.xz = rotate(p.xz, 11.0 * sin(99.0 *row(p.y, 22.)) + 4.0 * CurTime * cos(66.0 * row(p.y, 22.)));
|
|
repeat(p.y, 22.);
|
|
float d = length(p.xz) - 22.0;
|
|
p.z -= 12.0;
|
|
float e = length(p.xz) - 28.0;
|
|
repeatr(p.xz, 0.0, pi2 / 22.0);
|
|
return 0.6 * max( length(p.y) - 5.0,
|
|
smin(
|
|
smin( length(d) - 0.5, length(e) - 0.5, 4.0),
|
|
max( length(p.yz) - 0.5, max(e + 2.0, 2.0 - d)),
|
|
4.0));
|
|
}
|
|
else
|
|
{
|
|
repeat(p.z, 99.);
|
|
float f = p.x;
|
|
|
|
p.x -= 77. * smoothstep( 0.0, 0.6, CurTime2) - 77. * smoothstep( 0.6, 0.9, CurTime2);
|
|
vec3 o = p;
|
|
p.y -= 22. * smoothstep( 0.5, 0.7, CurTime2) - 22. * smoothstep( 0.9, 1.0, CurTime2);
|
|
p.y -= 55.0;
|
|
o.y -= 99.0;
|
|
p.z = 11.0 - length(p.z);
|
|
float d = CBox(o, vec3(22.0, 11.0, 33.0), 2.);
|
|
o.z = 22.0 - length(o.z);
|
|
float e = CBox(o, vec3(999.0, 4.0, 7.0), 2.);
|
|
o.x = f;
|
|
repeat(o.x, 11.);
|
|
return min( max( e, -length(o.xz) + 4.0 ),
|
|
smin( CBox(p, vec3(6.0, 44.0, 6.0), 2.), d, 8.0));
|
|
}
|
|
}
|
|
|
|
float f3(vec3 p)
|
|
{
|
|
if( shader == 0 )
|
|
{
|
|
if (CurScene < 2.)
|
|
{
|
|
return 999.;
|
|
}
|
|
float d = p.y + 77.0;
|
|
repeat(p.y, 11.0);
|
|
return max( max( length(p.y) - 2.0, d), length(CBox(p, vec3(22.,22.,22.), 3.)) - 2.0);
|
|
return max( max( abs( p.y - 2.0), d), length(CBox(p, vec3(22.,22.,22.), 3.)) - 2.0);
|
|
return max(p.y + 12., 24.0 - length(p.z) );
|
|
}
|
|
else if( shader == 1 )
|
|
{
|
|
p.y -= 11.;
|
|
repeat(p.y, 88.);
|
|
float d = p.x + 44.0;
|
|
p.yz = rotate(p.yz, 11.0 * sin(99.0 *row(p.x, 18.)) + 4.0 * CurTime * cos(77.0 * row(p.x, 18.)));
|
|
|
|
repeat(p.x, 18.0);
|
|
return max( d, max(CBox(p, vec3(5.,22.,22.), 2.), -CBox(p, vec3(11.,11.,11.), 4.) ));
|
|
}
|
|
else
|
|
{
|
|
repeat(p.z, 99.);
|
|
p.x -= 77. * smoothstep( 0.0, 0.6 , CurTime2);
|
|
repeat(p.x, 77.);
|
|
float d = torus(p, 22.0) - 9.0;
|
|
p.y -= 7.0;
|
|
d = smin( CBox(p, vec3(33.0, 7.0, 33.0), 2.), d, 8.);
|
|
p.y += 11.0;
|
|
return min( p.y + 10.0 + length( 4. - mod(p.x, 8.)) / 4.0, max( CBox(p, vec3(37.0, 6.0, 37.0), 3.), -d));
|
|
}
|
|
}
|
|
|
|
|
|
float f(vec3 p)
|
|
{
|
|
//if( shader == 0 )
|
|
return min( min( min( f0(p), f1(p) ), f2(p) ), f3(p) );
|
|
//else if ( shader == 1 )
|
|
// return .0; //min(min(min(f4(p),f5(p)),f6(p)),f7(p));
|
|
//else if ( shader == 2 )
|
|
// return .0; //min(min(min(f8(p),f9(p)),f10(p)),f11(p));
|
|
//else if ( shader == 3 )
|
|
// return .0; //min( min(f12(p),f13(p)),f14(p));
|
|
}
|
|
|
|
void mat(vec3 p)
|
|
{
|
|
float z= 0.5;
|
|
|
|
if( z > f0(p) )
|
|
{
|
|
HitMaterial = vec4(-1.0, 0.4, 0., 1.6);
|
|
CurColor = vec3(0.5,.0,.1 );
|
|
CurStep= .3;
|
|
}
|
|
|
|
if( z > f1(p) )
|
|
{
|
|
z= f1(p);
|
|
|
|
HitMaterial = vec4(-2.0, 0.8, 0., 4.);
|
|
CurColor = vec3(0.4,0.1,0.0 );
|
|
CurStep= .8;
|
|
}
|
|
|
|
if( z > f2(p) )
|
|
{
|
|
z= f3(p);
|
|
|
|
HitMaterial = vec4(-2.0, 0.8, 0.5, 1.2);
|
|
CurColor = vec3(1.1,0.8,0.7);
|
|
CurStep= .1;
|
|
}
|
|
|
|
if( z > f3(p) )
|
|
{
|
|
z= f2(p);
|
|
|
|
HitMaterial = vec4(-1.0, -.3, 0.5, 0.9);
|
|
CurColor = vec3(.2,.2,.2);
|
|
CurStep= .05;
|
|
CurNormal.y= 0.;
|
|
CurNormal.x= 0.;
|
|
//m=2;
|
|
}
|
|
}
|
|
|
|
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.7, 0.7, 0.0),normal)) * color;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
//Z = (gl_FragCoord.xy / Y.zw) * vec2(Y.z/Y.w, 1);
|
|
|
|
CurTime= Y.y;
|
|
CurScene= Y.x;
|
|
CurTime2= CurTime * CurTime;
|
|
// Get the look direction for the current pixel (always look forwards)
|
|
|
|
vec3 rayDir = vec3((gl_FragCoord.xy / Y.z - 0.5), 0.6);
|
|
rayDir.x -= Y.w;
|
|
float vignette = 1.0 - length(rayDir.xy / vec2(2.6,2.));
|
|
|
|
//Kamera sitzt an dieser Position
|
|
vec3 p = vec3( 99.0, 55.0, 44.0) * (1.0 - CurTime * 0.3);
|
|
|
|
if( CurScene-- < 1.0 )
|
|
{
|
|
//p= vec3( 99.0, 55.0, 44.0) * (1.0 - CurTime * 0.3);
|
|
rayDir.yz= rotate( rayDir.yz, 0.4 );
|
|
rayDir.xz= rotate( rayDir.xz, 2.6 );
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( -33.0, -11.0, CurTime * 33.0);
|
|
rayDir.yz= rotate( rayDir.yz, -0.4 );
|
|
rayDir.xz= rotate( rayDir.xz, 4.5 );
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( 11.0, -99.0 * (1.0 - CurTime * 1.2), -88.);
|
|
rayDir.yz= rotate( rayDir.yz, 0.5 );
|
|
//rayDir.xz= rotate( rayDir.xz, 4.5 );
|
|
CurTime2 = 0.0;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( -33.0, 44.0 * (1.0 - CurTime * 0.4), -99.);
|
|
rayDir.yz= rotate( rayDir.yz, 0.5 );
|
|
//rayDir.xz= rotate( rayDir.xz, 4.5 );
|
|
//CurTime2 = CurTime;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( 11.0, 66.* (1.0 - CurTime * 0.4), -33.);
|
|
rayDir.yz= rotate( rayDir.yz, 1.2 );
|
|
//rayDir.xz= rotate( rayDir.xz, 4.5 );
|
|
//CurTime2 = CurTime;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( -66.0, -88.* (0.6 + CurTime * 0.3), 66.);
|
|
rayDir.yz= rotate( rayDir.yz, -0.4 );
|
|
rayDir.xz= rotate( rayDir.xz, 4.5 );
|
|
//CurTime2 = 0.0;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( -33.0, -99.* (0.5 + CurTime), -33.);
|
|
rayDir.yz= rotate( rayDir.yz, -0.3 );
|
|
rayDir.xz= rotate( rayDir.xz, 5.3 );
|
|
//CurTime2 = 0.0;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( 0.0, -99.* (0.5 + CurTime * 1.5), -6.);
|
|
rayDir.yz= rotate( rayDir.yz, -1.0 );
|
|
//CurTime2 = 0.0;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
////////////// Shader 1
|
|
p= vec3(-88.* (1. + CurTime * 1.), 10.0, -4.);
|
|
rayDir.yz= rotate( rayDir.yz, -0.3 );
|
|
rayDir.xz= rotate( rayDir.xz, 1. - CurTime );
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3(-88.* (1. - CurTime * 0.4), 13.0, 4.);
|
|
rayDir.yz= rotate( rayDir.yz, 0.3 );
|
|
rayDir.xz= rotate( rayDir.xz, 3. + CurTime );
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3(-33.* (1. - CurTime * 0.6), 103.0, -6.);
|
|
rayDir.yz= rotate( rayDir.yz, 0.6 );
|
|
rayDir.xz= rotate( rayDir.xz, 6. );
|
|
CurTime2 *= 2.0;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( -8.0, -99.* (CurTime * 1.8), 6.);
|
|
rayDir.yz= rotate( rayDir.yz, 0.6 + CurTime );
|
|
rayDir.xz= rotate( rayDir.xz, 3. );
|
|
CurTime2 *= 2.0;
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
////////////// Shader 2
|
|
p= vec3( -88., 22.0, -99.0 * (1.0 - CurTime * 1.2));
|
|
//rayDir.yz= rotate( rayDir.yz, 0.6 + CurTime );
|
|
rayDir.xz= rotate( rayDir.xz, 5.5 );
|
|
CurTime = CurTime * 8.0 + 0.6;
|
|
CurTime2 = mod( CurTime, 1.0);
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
p= vec3( 166.0, 44.0, 99.0 * (1.0 - CurTime * 3.3));
|
|
rayDir.yz= rotate( rayDir.yz, 0.4 );
|
|
rayDir.xz= rotate( rayDir.xz, 1.0 - CurTime );
|
|
CurTime = CurTime * 8.0 + 0.6;
|
|
CurTime2 = mod( CurTime, 1.0);
|
|
}
|
|
else if( CurScene-- < 1.0 )
|
|
{
|
|
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-- < 1.0 )
|
|
{
|
|
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;
|
|
|
|
@D
|
|
/////////////////////////////////////////////////////////////////////
|
|
//Debugzeug fuer Kamerasteuerung
|
|
if( true )
|
|
{
|
|
p.x= gl_ModelViewMatrix[0][0];
|
|
p.y= gl_ModelViewMatrix[0][1];
|
|
p.z= gl_ModelViewMatrix[0][2];
|
|
|
|
float a1= gl_ModelViewMatrix[1][1];
|
|
float c1,s1;
|
|
|
|
//vec3 q1= vec3((Z.xy - 0.5), 0.6);
|
|
|
|
float ScreenHeight = Y.w;
|
|
float AspectOffset = 1280.0 / 720.0 * 0.5 - 0.5; //= 0.445;
|
|
|
|
vec3 q1 = vec3((gl_FragCoord.xy / Y.z - 0.5), 0.6);
|
|
q1.x -= Y.w;
|
|
|
|
c1 = cos(a1); s1 = sin(a1);
|
|
rayDir.y = c1 * q1.y - s1 * q1.z;
|
|
rayDir.x= q1.x;
|
|
rayDir.z = s1 * q1.y + c1 * q1.z;
|
|
|
|
a1= gl_ModelViewMatrix[1][0];
|
|
q1=rayDir;
|
|
c1 = cos(a1); s1 = sin(a1);
|
|
rayDir.x = c1 * q1.x + s1 * q1.z;
|
|
rayDir.z = -s1 * q1.x + c1 * q1.z;
|
|
}
|
|
//Ende Debugzeug fuer Kamerasteuerung
|
|
/////////////////////////////////////////////////////////////////////
|
|
@@
|
|
|
|
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);
|
|
while(m++<2)
|
|
{
|
|
//bis zu einer Oberflaeche steppen
|
|
//for (CurStep=1.0;t<250.0 && CurStep>t*.003;t+=0.01+max(0.0, CurStep),RayStep=rayDir*t )
|
|
for (CurStep=1.0;t<999.0 && CurStep>t*.0005;t+=CurStep,RayStep=rayDir*t )
|
|
{
|
|
CurStep = f(p+RayStep);
|
|
}
|
|
|
|
vec3 NextPos = p+RayStep;
|
|
|
|
//Startpunkt und Richtung fuer reflektierten Strahl;
|
|
p= NextPos;
|
|
|
|
CurNormal = vec2(0.04, 0.0);
|
|
vec3 n= normalize(vec3( f(p + CurNormal.xyy) - f(p - CurNormal.xyy), f(p + CurNormal.yxy) - f(p - CurNormal.yxy), f(p + CurNormal.yyx) - f(p - CurNormal.yyx) ));
|
|
//CurStep ab hier == Reflektion !!!
|
|
mat(p);
|
|
|
|
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 * lightSphere(rayDir, BackColor, HitMaterial.xy);
|
|
|
|
cRes+= cFac*CurColor;//*(1.0-Reflect);
|
|
cFac*= CurStep;// Reflect * (1.0-t/tmax);
|
|
t= 0.5;
|
|
RayStep=rayDir*t;
|
|
}
|
|
|
|
gl_FragColor.xyz = smoothstep(15.8, 15.79, Y.x + Y.y) * vignette *
|
|
min(1.0,sin(Y.y * pi2 / 2.0)*15.8) //fade
|
|
* (cRes + cFac*
|
|
( lightSphere(rayDir, LightColor, HitMaterial.zw) +
|
|
lightSphere(rayDir, BackColor, HitMaterial.xy)));
|
|
|
|
}
|