summaryrefslogtreecommitdiffstats
path: root/ray_marching.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'ray_marching.cginc')
-rw-r--r--ray_marching.cginc66
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;
}