diff options
| -rw-r--r-- | 3ner.cginc | 7 | ||||
| -rw-r--r-- | 3ner.shader | 15 | ||||
| -rw-r--r-- | features.cginc | 4 | ||||
| -rw-r--r-- | globals.cginc | 14 | ||||
| -rw-r--r-- | ray_marching.cginc | 37 |
5 files changed, 53 insertions, 24 deletions
@@ -251,12 +251,7 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace) : SV_Target { #endif #if defined(_RAY_MARCHING) - // TODO consider doing assignment inside function. It would clean up this - // call site. - RayMarchResult res = ray_march(i); - i.objPos = res.objPos; - i.normal = res.objNorm; - i.tangent.xyz = res.objTan; + ray_march(i); #elif defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) deform_normal(i.objPos_orig, i.normal, i.tangent.xyz); #endif diff --git a/3ner.shader b/3ner.shader index f84b3fe..8b05bbf 100644 --- a/3ner.shader +++ b/3ner.shader @@ -57,6 +57,17 @@ Shader "yum_food/3ner" [HideInInspector] m_start_Ray_Marching("Ray Marching", Float) = 0 [ThryToggle(_RAY_MARCHING)] _Ray_Marching_Enabled("Enable", Float) = 0 + _Ray_Marching_Max_Dist("Max dist", Float) = 1 + _Ray_Marching_Min_Dist("Min dist", Float) = 0.0001 + _Ray_Marching_Max_Iter("Max iterations", Range(0,50)) = 10 + + //ifex _Ray_Marching_Overstepping_Enabled==0 + [HideInInspector] m_start_Ray_Marching_Overstepping("Overstepping", Float) = 0 + [ThryToggle(_RAY_MARCHING_OVERSTEP)] _Ray_Marching_Overstepping_Enabled("Enable", Float) = 0 + _Ray_Marching_Overstepping_Factor("Factor", Range(1,2)) = 1.3 + [HideInInspector] m_end_Ray_Marching_Overstepping("Overstepping", Float) = 0 + //endex + //ifex _Ray_Marching_Baked_Origins_Enabled==0 [HideInInspector] m_start_Ray_Marching_Baked_Origins("Baked Origins", Float) = 0 [ThryToggle(_RAY_MARCHING_BAKED_ORIGINS)] _Ray_Marching_Baked_Origins_Enabled("Enable", Float) = 0 @@ -68,7 +79,9 @@ Shader "yum_food/3ner" [HideInInspector] m_start_Ray_Marching_Ball_Grid("Ball Grid", Float) = 0 [ThryToggle(_RAY_MARCHING_BALL_GRID)] _Ray_Marching_Ball_Grid_Enabled("Enable", Float) = 0 _Ray_Marching_Ball_Grid_Radius("Radius", Float) = 1 - _Ray_Marching_Ball_Grid_Count("Count", Range(0,40)) = 5 + _Ray_Marching_Ball_Grid_Count_X("Count X", Range(0,40)) = 5 + _Ray_Marching_Ball_Grid_Count_Y("Count Y", Range(0,40)) = 5 + _Ray_Marching_Ball_Grid_Count_Z("Count Z", Range(0,40)) = 5 [HideInInspector] m_end_Ray_Marching_Ball_Grid("Ball Grid", Float) = 0 //endex diff --git a/features.cginc b/features.cginc index cd9a8d7..49aa3e7 100644 --- a/features.cginc +++ b/features.cginc @@ -76,6 +76,10 @@ #pragma shader_feature_local _RAY_MARCHING //endex +//ifex _Ray_Marching_Overstepping_Enabled==0 +#pragma shader_feature_local _RAY_MARCHING_OVERSTEP +//endex + //ifex _Ray_Marching_Baked_Origins_Enabled==0 #pragma shader_feature_local _RAY_MARCHING_BAKED_ORIGINS //endex diff --git a/globals.cginc b/globals.cginc index 92fe8fd..533e102 100644 --- a/globals.cginc +++ b/globals.cginc @@ -120,13 +120,25 @@ float getTime() { #endif // _LOGICAL_TIME } +#if defined(_RAY_MARCHING) +float _Ray_Marching_Max_Dist; +float _Ray_Marching_Min_Dist; +float _Ray_Marching_Max_Iter; +#endif // _RAY_MARCHING + +#if defined(_RAY_MARCHING_OVERSTEP) +float _Ray_Marching_Overstepping_Factor; +#endif // _RAY_MARCHING_OVERSTEP + #if defined(_RAY_MARCHING_BAKED_ORIGINS) int _Baked_Origins_UV_Channel_Index; #endif // _RAY_MARCHING_BAKED_ORIGINS #if defined(_RAY_MARCHING_BALL_GRID) float _Ray_Marching_Ball_Grid_Radius; -float _Ray_Marching_Ball_Grid_Count; +float _Ray_Marching_Ball_Grid_Count_X; +float _Ray_Marching_Ball_Grid_Count_Y; +float _Ray_Marching_Ball_Grid_Count_Z; #endif // _RAY_MARCHING_BALL_GRID #endif // __GLOBALS_INC 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 |
