diff options
Diffstat (limited to 'ray_marching.cginc')
| -rw-r--r-- | ray_marching.cginc | 66 |
1 files changed, 14 insertions, 52 deletions
diff --git a/ray_marching.cginc b/ray_marching.cginc index e5ae03d..9c6653f 100644 --- a/ray_marching.cginc +++ b/ray_marching.cginc @@ -4,6 +4,7 @@ #include "math.cginc" #include "ray_marching_maps.hlsl" #include "texture_utils.cginc" +#include "vertex.cginc" struct RayMarchResult { float3 objPos; @@ -13,68 +14,28 @@ struct RayMarchResult { 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; -} -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(_Baked_Origins_UV_Channel_Index, _Baked_Origins_UV_Channel_Index+1); - float4 quat = GetRotation(i, uv_channels); - float4 iquat = float4(-quat.xyz, quat.w); - - 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); +#if defined(_VERTEX_DEFORMATION) + float3 rd_perp = i.normal * dot(i.normal, rd); + float3 rd_tan = rd - rd_perp; + float3 tmp = ro; + deform_normal(tmp, rd_perp, rd_tan); + rd = rd_perp + rd_tan; +#endif + const float kMinDist = 1e-3; // TODO dial this in & parameterize const float kMaxDist = 10; @@ -96,12 +57,13 @@ RayMarchResult ray_march(v2f i) { // TODO clip / hit detection float3 lclPos = ro + rd * d_acc; float3 lclNorm; - float3 lclTang; - map_normal(lclPos, lclNorm, lclTang); + float3 lclTan; + map_normal(lclPos, lclNorm, lclTan); RayMarchResult res; - GetObjPosNorm(i, lclPos, lclNorm, lclTang, - res.objPos, res.objNorm, res.objTan); + res.objPos = lclPos; + res.objNorm = lclNorm; + res.objTan = lclTan; return res; } |
