summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--3ner.cginc7
-rw-r--r--3ner.shader15
-rw-r--r--features.cginc4
-rw-r--r--globals.cginc14
-rw-r--r--ray_marching.cginc37
5 files changed, 53 insertions, 24 deletions
diff --git a/3ner.cginc b/3ner.cginc
index 24cf52d..d5f380f 100644
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -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