summaryrefslogtreecommitdiffstats
path: root/ray_marching.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-11-02 11:21:02 -0800
committeryum <yum.food.vr@gmail.com>2025-11-02 11:21:02 -0800
commit7fd93cd70100e0636ffae430a7ab1904788fb5f3 (patch)
treeed9d67e4d850186ed4b18f13d5d4dfef5b043fcc /ray_marching.cginc
parent93f27e3a8545fef6ccc293d033e5f422ed821215 (diff)
raymarching tweaks + add overstepping
Diffstat (limited to 'ray_marching.cginc')
-rw-r--r--ray_marching.cginc37
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