diff options
| author | yum <yum.food.vr@gmail.com> | 2025-10-28 21:33:40 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-10-28 21:33:40 -0700 |
| commit | 15f9778a65a0f163627bd229b8f212cc5c7c0c22 (patch) | |
| tree | b4b6c90defa76b9086b3b1f02bcd2a6401e019e7 /ray_marching.cginc | |
| parent | 6c93421c1a10caf9e4f6996e1109379a504c19a7 (diff) | |
some ray marching
Diffstat (limited to 'ray_marching.cginc')
| -rw-r--r-- | ray_marching.cginc | 88 |
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 |
