Slide 25
Slide 25 text
vec3 trace( vec3 ro, in vec3 rd, in float tmin, in float tmax )
{
ro += tmin*rd;
vec2 pos = floor(ro.xz);
vec3 rdi = 1.0/rd;
vec3 rda = abs(rdi);
vec2 rds = sign(rd.xz);
vec2 dis = (pos-ro.xz+ 0.5 + rds*0.5) * rdi.xz;
vec3 res = vec3( -1.0 );
// traverse regular grid (in 2D)
vec2 mm = vec2(0.0);
for( int i=0; i<28; i++ )
{
vec3 cub = mapH( pos );
#if 1
vec2 pr = pos+0.5-ro.xz;
vec2 mini = (pr-0.5*rds)*rdi.xz;
float s = max( mini.x, mini.y );
if( (tmin+s)>tmax ) break;
#endif
// intersect box
vec3 ce = vec3( pos.x+0.5, 0.5*cub.x, pos.y+0.5 );
vec3 rb = vec3(0.3,cub.x*0.5,0.3);
vec3 ra = rb + 0.12;
vec3 rc = ro - ce;
float tN = maxcomp( -rdi*rc - rda*ra );
float tF = maxcomp( -rdi*rc + rda*ra );
if( tN < tF )//&& tF > 0.0 )
{
// raymarch
float s = tN;
float h = 1.0;
for( int j=0; j<24; j++ )
{
h = udBox( rc+s*rd, rb, 0.1 );
s += h;
if( s>tF ) break;
}
if( h < (surface*s*2.0) )
{
res = vec3( s, cub.yz );
break;
}
}
// step to next cell
mm = step( dis.xy, dis.yx );
dis += mm*rda.xz;
pos += mm*rds;
}
res.x += tmin;
return res;
}