"Enhanced sphere tracing" by Mercury /et al./
This commit is contained in:
parent
32a8eb68a7
commit
6263999644
1 changed files with 43 additions and 2 deletions
|
@ -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 );
|
||||||
|
|
Loading…
Reference in a new issue