"Enhanced sphere tracing" by Mercury /et al./

This commit is contained in:
Emmanuel BENOîT 2017-10-03 09:12:21 +02:00
parent 32a8eb68a7
commit 6263999644

View file

@ -9,7 +9,7 @@ vec3 getNormal( vec3 pos )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
vec3 march( vec3 o , vec3 d , int steps , float factor ) vec3 RM_Basic( vec3 o , vec3 d , int steps , float factor )
{ {
int i = 0; int i = 0;
float dist = .01 , mat = -1; float dist = .01 , mat = -1;
@ -26,6 +26,47 @@ vec3 march( vec3 o , vec3 d , int steps , float factor )
return vec3( dist , dist >= u_Render.w ? -1 : mat , i ); return vec3( dist , dist >= u_Render.w ? -1 : mat , i );
} }
vec3 RM_Advanced( vec3 o , vec3 d , int steps , float factor )
{
const float dMin = .1 , dMax = u_Render.w , pixel = u_Render.z;
int i = 0;
float dist = dMin , mat = -1;
float omega = factor;
float cError = 1 / 0. , cDist = dMin;
float pRad = 0 , sLen = 0;
for ( ; i < steps ; ++ i ) {
vec2 res = map( o + d * dist );
float rad = abs( res.x );
bool sorFail = omega > 1 && ( rad + pRad ) < sLen;
if ( sorFail ) {
sLen -= omega * sLen;
omega = 1;
} else {
sLen = res.x * omega;
}
pRad = rad;
float error = rad / dist;
if ( !sorFail && error < cError ) {
cError = error;
cDist = dist;
}
if ( !sorFail && error < pixel || dist > dMax ) {
break;
}
dist += sLen;
}
if ( dist <= dMax && cError <= pixel ) {
return vec3( cDist , map( o + d * cDist ).y , i );
}
return vec3( cDist , -1 , steps );
}
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void main( ) void main( )
@ -40,7 +81,7 @@ void main( )
+ uv.x * side * u_Resolution.x / u_Resolution.y + uv.x * side * u_Resolution.x / u_Resolution.y
+ uv.y * up ); + uv.y * up );
vec3 r = march( camPos , rayDir , int( u_Render.x ) , u_Render.y ); vec3 r = RM_Advanced( camPos , rayDir , int( u_Render.x ) , u_Render.y );
vec3 hitPos = camPos + rayDir * r.x; vec3 hitPos = camPos + rayDir * r.x;
vec3 bc = vec3( 0 ); vec3 bc = vec3( 0 );