HTML

uveg

sc3n3 2011.12.27. 14:00

A chk_fig()ben levo felulet normal szamitasnal tul nagy volt a lepeskoz, ezert volt asszimetrikus a horizont a tukrozodesben. Erdemes az utolso kod alapjan atnezni a regieket, mert volt nehany bug. Az egeszet bemasolni nem jo otlet, mert kinyiffanhat az egesz program. Az ujraelesztes pedig egy kulon muveszet.

 

 

#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;
int type;
};


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) // benne is lehet!
// 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.1)//self, 0.1 kell!
{
ee.col=col;
ee.obj=spnt;
ee.tmin=t2;
ee.hit=1;
ee.type=2;

#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)*0.2;//meroleges , mellete levo pnt
dir=normalize(dir);
vec3 obj2=axis + dir*rd;//rd ua!

spnt.y+=0.2;//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.type=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);
}
}




#if 1
vec3 dv=vec3(12000.0,0.0,12000.0);
ee=chk_fig(vec3(0,0,0)+dv,vec3(0.2,0.5,0.7),ee);
ee=chk_ball2(vec3(100,50,100)+dv,50.0,vec3(0.5,0.3,0.2),ee); /////////////
#else
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<6;x++)
{
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(0.1,0.6,0.2),ee);
// ee=chk_ball2(bmin+vec3(50,50,50),50.0,vec3(0.1,0.4,0.2),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*12.0) break;//messze ment
}
#endif

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.3;//lets move, szedulok lol
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 al=0; al<4; al++ )//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
vec3 ray=camz*1.1 + camx*(txc.x-0.5+dx) + camy*(txc.y-0.5+dy);


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


for( int j=0; j<2; j++ )//j=0 reflect j=1 refract
{
ee.ray=normalize(ray);//restart
ee.src=eye;

float sz=1.0;
vec3 col3=vec3(0,0,0);
vec3 mat_col=vec3(1,1,1);
int type=0;

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

ee=chk_scene(ee,0.0);
if(i!=0)
if(length(ee.src-eye)>200.0*12.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)*6.0, vec3(0.0,0.2,0.99)*2.0, t1)*sz;//18 5

break;
}


float shadow=1.0,t6=length(light-ee.src);
// if(t6<1000.0)
if(j==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);
float pw=41e4;
if(ee.type==2) pw=1e4;
col3+=ee.col*vec3(0.99,0.9,0.7)*max(dot(ee.norm,w1),0.0)*pw*sz*shadow*mat_col/(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*mat_col*0.2;//0.9
col3+=vec3(0.6,0.7,0.9)*t2*0.34*sz*mat_col*0.2;//0.34

//ee.type!=2 &&

vec3 ref;
w1=normalize(ee.obj-ee.src);
if(j==0)
{
ref=w1-ee.norm*dot(ee.norm,w1)*2.0;//reflection
}
else
{
int ir=0;
if(dot(ee.norm,ee.src-ee.obj)<0.0) {ee.norm=-ee.norm;ir=1;}//normal az src fele!
vec3 ref_x=w1-ee.norm*dot(ee.norm,w1);//refraction
if(ir==0) ref=w1-ref_x/6.0;//0.04-0.4 0.07 /n
else ref=w1+ref_x*(1.0/5.0);//alulrol kapja *1/(n-1)
ref=normalize(ref);
}

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

ee.ray=ref;//new ray src
ee.src=ee.obj+ee.ray*0.02;
if(j==0) sz*=0.6;//7
else sz*=0.892;//6

type=ee.type;//next
mat_col=ee.col;
}//i

col3=col3*0.19;//0.25
col4+=col3*0.5;
}//j
}//al

gl_FragColor = vec4( col4/alias,1);
}



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

 

komment

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