diff options
Diffstat (limited to 'ray_marching.cginc')
| -rw-r--r-- | ray_marching.cginc | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/ray_marching.cginc b/ray_marching.cginc index 513178b..4c7544e 100644 --- a/ray_marching.cginc +++ b/ray_marching.cginc @@ -24,7 +24,7 @@ void GetRoRd(v2f i, out float3 ro, out float3 rd) { rd = normalize(getObjPos(i) - obj_space_camera_pos); } -RayMarchResult ray_march(v2f i) { +void ray_march(inout v2f i) { float3 ro, rd; GetRoRd(i, ro, rd); @@ -36,21 +36,25 @@ RayMarchResult ray_march(v2f i) { rd = normalize(rd_perp + rd_tan); #endif - const float kMinDist = 1e-4; - // TODO dial this in & parameterize - const float kMaxDist = 10; - // TODO parameterize - const uint kMaxIter = 30; + const float kMinDist = _Ray_Marching_Min_Dist; + const float kMaxDist = _Ray_Marching_Max_Dist; + const uint kMaxIter = _Ray_Marching_Max_Iter; + float d_cur; float d_acc = 0; for (uint ii = 0; ii < kMaxIter; ++ii) { float3 p = ro + rd * d_acc; - float d_cur = 1e9; + d_cur = 1e9; #if defined(_RAY_MARCHING_BALL_GRID) - float3 count = _Ray_Marching_Ball_Grid_Count; + float3 count = float3(_Ray_Marching_Ball_Grid_Count_X, _Ray_Marching_Ball_Grid_Count_Y, _Ray_Marching_Ball_Grid_Count_Z); d_cur = min(d_cur, map_ball_grid(p, count)); #endif + +#if defined(_RAY_MARCHING_OVERSTEP) + d_cur *= _Ray_Marching_Overstepping_Factor; +#endif + d_acc += d_cur; - if (d_cur < kMinDist) { + if (abs(d_cur) < kMinDist) { break; } if (d_acc > kMaxDist) { @@ -58,21 +62,22 @@ RayMarchResult ray_march(v2f i) { } } + if (abs(d_cur) > kMinDist) { + discard; + } + // TODO clip / hit detection float3 lclPos = ro + rd * d_acc; float3 lclNorm; float3 lclTan; #if defined(_RAY_MARCHING_BALL_GRID) - float3 count = _Ray_Marching_Ball_Grid_Count; + float3 count = float3(_Ray_Marching_Ball_Grid_Count_X, _Ray_Marching_Ball_Grid_Count_Y, _Ray_Marching_Ball_Grid_Count_Z); map_ball_grid_normal(count, lclPos, lclNorm, lclTan); #endif - RayMarchResult res; - res.objPos = lclPos; - res.objNorm = lclNorm; - res.objTan = lclTan; - - return res; + i.objPos = lclPos; + i.normal = lclNorm; + i.tangent.xyz = lclTan; } #endif // __RAY_MARCHING_INC |
