summaryrefslogtreecommitdiffstats
path: root/ray_marching.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-10-28 21:33:40 -0700
committeryum <yum.food.vr@gmail.com>2025-10-28 21:33:40 -0700
commit15f9778a65a0f163627bd229b8f212cc5c7c0c22 (patch)
treeb4b6c90defa76b9086b3b1f02bcd2a6401e019e7 /ray_marching.cginc
parent6c93421c1a10caf9e4f6996e1109379a504c19a7 (diff)
some ray marching
Diffstat (limited to 'ray_marching.cginc')
-rw-r--r--ray_marching.cginc88
1 files changed, 81 insertions, 7 deletions
diff --git a/ray_marching.cginc b/ray_marching.cginc
index 69f6438..e5ae03d 100644
--- a/ray_marching.cginc
+++ b/ray_marching.cginc
@@ -1,35 +1,109 @@
#ifndef __RAY_MARCHING_INC
#define __RAY_MARCHING_INC
+#include "math.cginc"
+#include "ray_marching_maps.hlsl"
+#include "texture_utils.cginc"
+
struct RayMarchResult {
float3 objPos;
float3 objNorm;
+ float3 objTan;
};
+float3 getObjPos(v2f i)
+{
+#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION)
+ return i.objPos_orig;
+#else
+ return i.objPos;
+#endif
+}
+
+#if defined(_RAY_MARCHING_BAKED_ORIGINS)
float3 GetFragToOrigin(v2f i) {
return (i.color * 2.0f - 1.0f) / i.color.a;
}
-
float4 GetRotation(v2f i, float2 uv_channels) {
float4 quat;
quat.xy = get_uv_by_channel(i, uv_channels.x);
quat.zw = get_uv_by_channel(i, uv_channels.y);
return quat;
}
-
-RayMarchResult march_c31_00(v2f i) {
+void GetRoRd(v2f i, out float3 ro, out float3 rd) {
float3 obj_space_camera_pos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1.0));
float3 frag_to_origin = GetFragToOrigin(i);
- float2 uv_channels = float2(_Custom30_Quaternion_UV_Channel_0, _Custom30_Quaternion_UV_Channel_1);
+ float2 uv_channels = float2(_Baked_Origins_UV_Channel_Index, _Baked_Origins_UV_Channel_Index+1);
float4 quat = GetRotation(i, uv_channels);
float4 iquat = float4(-quat.xyz, quat.w);
- float3 ro = -frag_to_origin;
- float3 rd = normalize(i.objPos - obj_space_camera_pos);
+ ro = -frag_to_origin;
+ rd = normalize(getObjPos(i) - obj_space_camera_pos);
rd = rotate_vector(rd, iquat);
+}
+void GetObjPosNorm(v2f i, float3 lclPos, float3 lclNorm, float3 lclTang,
+ out float3 objPos, out float3 objNorm, out float3 objTan) {
+ float3 frag_to_origin = GetFragToOrigin(i);
+ float2 uv_channels = float2(_Baked_Origins_UV_Channel_Index, _Baked_Origins_UV_Channel_Index+1);
+ float4 quat = GetRotation(i, uv_channels);
+ float4 iquat = float4(-quat.xyz, quat.w);
+
+ float3 objHit = rotate_vector(lclPos, quat);
+ float3 objCenterOffset = rotate_vector(frag_to_origin, quat);
+ objPos = objHit + (getObjPos(i) + objCenterOffset);
+
+ objNorm = rotate_vector(lclNorm, quat);
+ objTan = rotate_vector(lclTang, quat);
+}
+#else
+void GetRoRd(v2f i, out float3 ro, out float3 rd) {
+ ro = getObjPos(i);
+ float3 objCamPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1));
+ float3 obj_space_camera_pos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1.0));
+ rd = normalize(getObjPos(i) - obj_space_camera_pos);
+}
+void GetObjPosNorm(v2f i, float3 lclPos, float3 lclNorm, float3 lclTang,
+ out float3 objPos, out float3 objNorm, out float3 objTan) {
+ objPos = lclPos;
+ objNorm = lclNorm;
+ objTan = lclTang;
+}
+#endif // _RAY_MARCHING_BAKED_ORIGINS
+
+RayMarchResult ray_march(v2f i) {
+ float3 ro, rd;
+ GetRoRd(i, ro, rd);
+
+ const float kMinDist = 1e-3;
+ // TODO dial this in & parameterize
+ const float kMaxDist = 10;
+ // TODO parameterize
+ const uint kMaxIter = 10;
+ float d_acc = 0;
+ for (uint ii = 0; ii < kMaxIter; ++ii) {
+ float3 p = ro + rd * d_acc;
+ float d_cur = map(p);
+ d_acc += d_cur;
+ if (d_cur < kMinDist) {
+ break;
+ }
+ if (d_acc > kMaxDist) {
+ break;
+ }
+ }
+
+ // TODO clip / hit detection
+ float3 lclPos = ro + rd * d_acc;
+ float3 lclNorm;
+ float3 lclTang;
+ map_normal(lclPos, lclNorm, lclTang);
+
+ RayMarchResult res;
+ GetObjPosNorm(i, lclPos, lclNorm, lclTang,
+ res.objPos, res.objNorm, res.objTan);
- ro -= rd * _Custom30_ro_Offset;
+ return res;
}
#endif // __RAY_MARCHING_INC