HTML

csempezes

sc3n3 2011.12.27. 11:06

A gorbe felulet metszete nem tokeletes, de 3 ora munkabol ennyire futotta,

Minden szabadon felhasznalhato, az itt levo kodokbol.


 



#ifdef GL_ES
precision highp float;
#endif


//#define aliasing

uniform vec2 resolution;
uniform float time;
uniform sampler2D tex0;
//uniform sampler2D tex1;

#define pi 3.1415926

struct pack
{
vec3 src;
vec3 ray;

vec3 col;
vec3 obj;
vec3 norm;

float tmin;
int hit;
};


float sgn(float n)
{
if(n<0.0) return -1.0;
if(n>0.0) return 1.0;
return 0.0;
}
vec3 floorv(vec3 v1)
{
v1.x=floor(v1.x);
v1.y=floor(v1.y);
v1.z=floor(v1.z);

return v1;
}
float noise( float n )
{
return (sin(n+time*0.945)*43348.5453);//fract!
}
vec3 lerp(vec3 v1,vec3 v2,float t)
{
return v1+(v2-v1)*t;
}
vec3 boxchk4(pack ee,vec3 box,vec3 box2,int side)
{
// box2+=box;//max

float t1=0.0;
vec3 w1,norm, obj;

vec3 bbox1;
vec3 bbox2;
if(side==1) {bbox1=box;bbox2=box2;}
else {bbox1=box2;bbox2=box;}

if(ee.ray.x<0.0) t1=(bbox2.x-ee.src.x)/ee.ray.x;
else t1=(bbox1.x-ee.src.x)/ee.ray.x;

if(t1>0.01)
// if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;

if(obj.y>=box.y)
if(obj.y<=box2.y)
if(obj.z>=box.z)
if(obj.z<=box2.z) return obj;
}



if(ee.ray.y<0.0) t1=(bbox2.y-ee.src.y)/ee.ray.y;
else t1=(bbox1.y-ee.src.y)/ee.ray.y;

if(t1>0.01)
// if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;
if(obj.x>=box.x)
if(obj.x<=box2.x)
if(obj.z>=box.z)
if(obj.z<=box2.z) return obj;
}


if(ee.ray.z<0.0) t1=(bbox2.z-ee.src.z)/ee.ray.z;
else t1=(bbox1.z-ee.src.z)/ee.ray.z;

if(t1>0.01)
// if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;
if(obj.y>=box.y)
if(obj.y<=box2.y)
if(obj.x>=box.x)
if(obj.x<=box2.x) return obj;
}

return vec3(-1.0,0,0);
}
int boxchk3(pack ee,vec3 box,vec3 box2)
{
if(ee.src.x>=box.x)
if(ee.src.y>=box.y)
if(ee.src.z>=box.z)
if(ee.src.x<=box2.x)
if(ee.src.y<=box2.y)
if(ee.src.z<=box2.z) return 1;//inside

float t1=0.0;
vec3 w1,norm, obj;

if(ee.ray.x<0.0) t1=(box2.x-ee.src.x)/ee.ray.x;
else t1=(box.x-ee.src.x)/ee.ray.x;

if(t1>0.01)
// if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;

if(obj.y>=box.y)
if(obj.y<=box2.y)
if(obj.z>=box.z)
if(obj.z<=box2.z) return 1;
}



if(ee.ray.y<0.0) t1=(box2.y-ee.src.y)/ee.ray.y;
else t1=(box.y-ee.src.y)/ee.ray.y;

if(t1>0.01)
// if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;
if(obj.x>=box.x)
if(obj.x<=box2.x)
if(obj.z>=box.z)
if(obj.z<=box2.z) return 1;
}


if(ee.ray.z<0.0) t1=(box2.z-ee.src.z)/ee.ray.z;
else t1=(box.z-ee.src.z)/ee.ray.z;

if(t1>0.01)
// if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;
if(obj.y>=box.y)
if(obj.y<=box2.y)
if(obj.x>=box.x)
if(obj.x<=box2.x) return 1;
}

return 0;
}
pack boxchk(pack ee,vec3 box,vec3 box2,vec3 col)
{
box2+=box;//max

float t1=0.0;
vec3 w1,norm, obj;

if(ee.ray.x<0.0) t1=(box2.x-ee.src.x)/ee.ray.x;
else t1=(box.x-ee.src.x)/ee.ray.x;

if(t1>0.01)
if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;

if(obj.y>=box.y)
if(obj.y<=box2.y)
if(obj.z>=box.z)
if(obj.z<=box2.z)
{
ee.col=col;
if(ee.ray.x<0.0) norm=vec3( 1,0,0);
else norm=vec3(-1,0,0);
ee.obj=obj;
ee.norm=norm;

ee.hit=1;
ee.tmin=t1;
}
}



if(ee.ray.y<0.0) t1=(box2.y-ee.src.y)/ee.ray.y;
else t1=(box.y-ee.src.y)/ee.ray.y;

if(t1>0.01)
if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;
if(obj.x>=box.x)
if(obj.x<=box2.x)
if(obj.z>=box.z)
if(obj.z<=box2.z)
{
ee.col=col;
if(ee.ray.y<0.0) norm=vec3(0, 1,0);
else norm=vec3(0,-1,0);
ee.obj=obj;
ee.norm=norm;

ee.hit=1;
ee.tmin=t1;
}
}


if(ee.ray.z<0.0) t1=(box2.z-ee.src.z)/ee.ray.z;
else t1=(box.z-ee.src.z)/ee.ray.z;

if(t1>0.01)
if(t1<ee.tmin)
{
obj=ee.src + ee.ray*t1;
if(obj.y>=box.y)
if(obj.y<=box2.y)
if(obj.x>=box.x)
if(obj.x<=box2.x)
{
ee.col=col;
if(ee.ray.z<0.0) norm=vec3(0,0, 1);
else norm=vec3(0,0,-1);
ee.obj=obj;
ee.norm=norm;

ee.hit=1;
ee.tmin=t1;

}
}

return ee;
}

pack chk_ball2(vec3 ball,float r,vec3 col,pack ee)
{
ball.y+=10.0+10.0*sin(time + dot(ball,vec3(6.0,3.0,1.0)));
ball.y+=10.0+10.0*sin(time + dot(col,vec3(6.0,3.0,1.0)));
vec3 ball2eyes=ee.src-ball;

float a=dot(ee.ray,ee.ray);
float b=dot(ee.ray,ball2eyes)*2.0 ;
float c=dot(ball2eyes,ball2eyes)-r*r;

float D=b*b-a*c*4.0;
if(D>=0.0)
{
float t1=(-b-sqrt(D))/(a*2.0);

if(t1>0.01)
if(t1<ee.tmin)
{
ee.col=col;
ee.obj=ee.src + ee.ray*t1;
ee.norm=normalize(ee.obj-ball);

ee.tmin=t1;
ee.hit=1;
}
}

return ee;
}
float getcurve(float t)
{
float e=0.0,e2=0.0;
#if 1
if(t>70.0)//0-80-120
{
t-=95.0; t*=0.8;
float r=32.0;r*=r;
e=sqrt(r-t*t);
}
#else
if(t>95.0)//0-80-120
{
t-=95.0;
float r=38.0;r*=r;
e=sqrt(r-t*t);
}
#endif
else
{
e=20.0+15.0*sin(t*0.1);
e2=22.0+5.0*sin(t*0.3435);
e=max(e,e2);
}

return e;
}
pack chk_fig(vec3 pos,vec3 col,pack ee)
{
vec3 bbox1=pos-vec3(40,0,40);
vec3 bbox2=pos+vec3(40,120,40);

vec3 pnt1=boxchk4(ee,bbox1,bbox2,0);
vec3 pnt2=boxchk4(ee,bbox1,bbox2,1);

// if(t1<ee.tmin) if(t2<ee.tmin)//nem biztos hogy lesz hit, bug
if(pnt1.x!=-1.0 || pnt2.x!=-1.0)
{
vec3 w1=pnt1-ee.src; float t1=dot(w1,w1);
w1=pnt2-ee.src; float t2=dot(w1,w1);
if(t2<t1) {w1=pnt1;pnt1=pnt2;pnt2=w1;}///xchg

vec3 axis=pos;//forgastengely, magassag=y valtozik csak
vec3 pnt=pnt1;
vec3 dpnt=normalize(pnt2-pnt1);
vec3 spnt=vec3(0,0,0);
float tmin=1e16;
float step=12.0;//12 t3 atallitja!
int hit=0;

for(int i=0;i<16;i++)
{
axis.y=pnt.y;
vec3 dir=pnt-axis;// radialis vektor
float ld=dot(dir,dir);//length(dir);dir=normalize(dir);

float rd=getcurve(pnt.y);
float t1=rd*rd-ld;//pnt a feluleten belul
float t3=abs(t1)*9.0;//step korrekcio, felulet kozeleben korrigal, 2=szemcses, 5=durva 3^2
if(t3<step) step=t3;
if(t1>=0.0)//hit
{
pnt-=dpnt*step;
step*=0.5;//fele akkora lepessel tovabb

if(step<0.5) hit=1;//0.1 eleg kicsi, itt a felulet!
}
pnt+=dpnt*step;
}
spnt=pnt;
t2=length(spnt-ee.src);

if(hit==1)//real hit
if(t2<ee.tmin)
if(t2>0.01)//self
{
ee.col=col;
ee.obj=spnt;
ee.tmin=t2;
ee.hit=1;

#if 1
//felulet normal
float rd=getcurve(spnt.y);
axis.y=spnt.y;
vec3 dir=spnt-axis;
dir=normalize(dir);
vec3 obj1=axis + dir*rd;

dir+=vec3(dir.z,0.0,-dir.x)*2.0;//meroleges , mellete levo pnt
dir=normalize(dir);
vec3 obj2=axis + dir*rd;//rd ua!

spnt.y+=2.0;//felette levo pnt
rd=getcurve(spnt.y);
axis.y=spnt.y;
dir=spnt-axis;
dir=normalize(dir);
vec3 obj3=axis + dir*rd;

ee.norm=normalize(cross(obj2-obj1, obj3-obj1));
#endif
}
}
return ee;
}
pack chk_scene(pack ee,float tmin)
{
ee.tmin=1e16;
if(tmin!=0.0) ee.tmin=tmin;
ee.hit=0;
ee.col=vec3(0,0,0);

if(ee.ray.y<0.0)//ground
{
ee.col=vec3(0,0,1);
float t1=(0.0-ee.src.y)/ee.ray.y;
ee.obj=ee.src + ee.ray*t1;
vec3 w1=fract(ee.obj/90.0);

#if 1
if(w1.x>0.5) if(w1.z<0.5) ee.col=vec3(1,1,1);
if(w1.x<0.5) if(w1.z>0.5) ee.col=vec3(1,1,1);
#else
ee.col = texture2D(tex0,w1.xz/110.0).xyz*3.0;
#endif

ee.norm=vec3(0,1,0);
ee.tmin=t1;
ee.hit=1;

//csempe letores
w1=mod(ee.obj,45.0);
if(w1.x<3.0)
{
float aa=w1.x*pi*0.5/3.0;
ee.norm=vec3(0.0,sin(aa),cos(aa)*0.6);//0 nal fekszik a normal!
ee.norm=normalize(ee.norm);
}
if(w1.x>45.0-3.0)
{
float aa=(w1.x-45.0-3.0)*pi*0.5/3.0;
ee.norm=vec3(0.0,sin(aa),-cos(aa)*0.6);
ee.norm=normalize(ee.norm);
}
if(w1.z<3.0)
{
float aa=w1.z*pi*0.5/3.0;
ee.norm=vec3(0.0,sin(aa),cos(aa)*0.6);//0 nal fekszik a normal!
ee.norm=normalize(ee.norm);
}
if(w1.z>45.0-3.0)
{
float aa=(w1.z-45.0-3.0)*pi*0.5/3.0;
ee.norm=vec3(0.0,sin(aa),-cos(aa)*0.6);
ee.norm=normalize(ee.norm);
}
}


float hh=200.0;
vec3 dbase=vec3(hh,hh,hh);
if(ee.ray.x<0.0) dbase.x=0.0;//benne lesz a dobozban, nem kell tovabblepni!
if(ee.ray.y<0.0) dbase.y=0.0;
if(ee.ray.z<0.0) dbase.z=0.0;

vec3 src3=ee.src;//kulon!
vec3 base=floorv(src3/hh)*hh;
for(int x=0;x<8;x++)//8 12,max 20 eleg
{
vec3 bmin=base;
vec3 bmax=bmin+vec3( hh,210,hh);


if(src3.y>-50.0)
if(src3.y<350.0)
{
if(boxchk3(ee,bmin,bmax)==1)
{
ee=chk_fig(bmin+vec3(50,0,50),vec3(1,0,0),ee);
}
}
vec3 base2=base+dbase;//kovetkezo 3 fal
vec3 t3=(base2-src3)/ee.ray;
t3.x=min(t3.x,min(t3.y,t3.z));

src3+=ee.ray*t3.x;//elore
src3+=ee.ray*0.01;//belep a dobozba
base=floorv(src3/hh)*hh;

if(src3.y>350.0) if(ee.ray.y>0.0) break;//up
if(src3.y<-50.0) if(ee.ray.y<0.0) break;//up

if(length(src3-ee.src)>hh*8.0) break;//messze ment
}

return ee;
}


void main(void)
{
vec2 txc = gl_FragCoord.xy / resolution.xy;
txc.x *= resolution.x/resolution.y;

vec3 eye=vec3(100,250,300);
vec3 lookat=vec3(0,50,0);
vec3 up=vec3(0,1,0);

float r2=420.0;
lookat=vec3(120,50,-210);
r2=320.0;

float aa=time*0.1;//lets move
eye=lookat+vec3(cos(aa)*r2,150.0,sin(aa)*r2);

vec3 dv=vec3(12000.0,0.0,12000.0);//negative voxel bug
eye+=dv;
lookat+=dv;


vec3 camz=normalize(lookat-eye);
vec3 camx=cross(camz,up);
vec3 camy=cross(camx,camz);


float rnd=123.124;
vec3 col4=vec3(0,0,0);
#ifdef aliasing
float alias=4.0;//12 ,4
for( int j=0; j<4; j++ )//12 ,4
#else
float alias=1.0;
#endif
{
pack ee;
float dx=0.0,dy=0.0;
#ifdef aliasing
rnd=noise( 340.123+rnd); dx=fract(rnd)/resolution.x;
rnd=noise( 2345.1423+rnd); dy=fract(rnd)/resolution.y;
#endif
ee.ray=camz*1.1 + camx*(txc.x-0.5+dx) + camy*(txc.y-0.5+dy);

ee.ray=normalize(ee.ray);
ee.src=eye;

vec3 w1;
vec3 light=vec3(200,500,-100)+dv;
aa=time*0.7;//lets move
light+=vec3(cos(aa)*350.0,0.0,sin(aa)*350.0);



float sz=1.0;
vec3 col3=vec3(0,0,0);

for( int i=0; i<3; i++ )//N=3 reflection
{

ee=chk_scene(ee,0.0);
if(i!=0)
if(length(ee.src-eye)>200.0*8.0) ee.hit=0;//stop//messze

if(ee.hit==0)
{
float t1=ee.ray.y;
t1=sqrt(t1);
col3+=lerp(vec3(0.5,0.7,0.99)*18.0, vec3(0.0,0.2,0.99)*5.0, t1)*sz;//5
break;
}


float shadow=1.0,t6=length(light-ee.src);
if(t6<3000.0)
{
pack ee2=ee;//chk shadow
ee2.ray=normalize(light-ee.obj);
ee2.src=ee.obj+ee2.ray*0.02;
ee2=chk_scene(ee2,t6);
if(ee2.hit==1) shadow=0.0;
}


#if 0
vec3 rndv;
rnd=noise(rnd+234.254); rndv.x=fract(rnd);
rnd=noise(rnd+2234.54); rndv.y=fract(rnd);
rnd=noise(rnd+24.25); rndv.z=fract(rnd);
ee.norm+=rndv*0.02;//smooth reflect
ee.norm=normalize(ee.norm);
#endif

w1=(light-ee.obj);
float lt=dot(w1,w1);
w1=normalize(w1);
col3+=ee.col*vec3(0.99,0.9,0.7)*max(dot(ee.norm,w1),0.0)*91e4*sz*shadow/(lt);

float t2=0.15+0.85*max(ee.norm.y,0.0);//ambient
col3+=ee.col*vec3(0.6,0.7,0.9)*t2*0.9*sz;
col3+=vec3(0.6,0.7,0.9)*t2*0.34*sz;

w1=normalize(ee.obj-ee.src);
vec3 ref=w1-ee.norm*dot(ee.norm,w1)*2.0;//reflection

w1=normalize(light-ee.obj);
float spec=max(dot(ref,w1),0.0);
col3+=vec3(0.99,0.9,0.7)*pow(spec,12.0)*7.0*sz*shadow;//specular

ee.ray=ref;//new ray src
ee.src=ee.obj+ee.ray*0.02;
sz*=0.4;//0.1 0.4

}

col3=col3*0.15;//0.25
col4+=col3;
}
gl_FragColor = vec4( col4/alias,1);
}



//http://www.iquilezles.org/apps/shadertoy/prese 

komment

süti beállítások módosítása