summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2025-11-04 21:50:42 -0800
committeryum <yum.food.vr@gmail.com>2025-11-04 21:50:42 -0800
commit672a7acca1f0401de7ac0ac94d3379081fa363e6 (patch)
tree1fed9ab4791de35d9fdc69bdff437fea2223349e
parentac78ce59232f698dfd721b0048336cd346612613 (diff)
begin work on marching in vert/domain shaders (NOT WORKING)
-rw-r--r--3ner.cginc3
-rw-r--r--3ner.shader118
-rw-r--r--features.cginc4
-rw-r--r--globals.cginc6
-rw-r--r--ray_marching.cginc33
-rw-r--r--vertex_deformation.slang2
6 files changed, 103 insertions, 63 deletions
diff --git a/3ner.cginc b/3ner.cginc
index e45e0cd..83c89ff 100644
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -251,7 +251,8 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace) : SV_Target {
#endif
#if defined(_RAY_MARCHING)
- ray_march(i);
+ const bool is_fragment = true;
+ ray_march(i, is_fragment);
#elif defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS)
deform_normal(i.objPos_orig, i.normal, i.tangent.xyz);
#endif
diff --git a/3ner.shader b/3ner.shader
index 3e7e9e0..14340e6 100644
--- a/3ner.shader
+++ b/3ner.shader
@@ -81,63 +81,79 @@ Shader "yum_food/3ner"
[HideInInspector] m_end_Ray_Marching_Baked_Origins("Baked Origins", Float) = 0
//endex
- //ifex _Ray_Marching_Cart_Instancing_Enabled==0
- [HideInInspector] m_start_Ray_Marching_Cart_Instancing("Cartesian Instancing", Float) = 0
- [ThryToggle(_RAY_MARCHING_CART_INSTANCING)] _Ray_Marching_Cart_Instancing_Enabled("Enable", Float) = 0
- [IntRange] _Ray_Marching_Cart_Instancing_Count_X("Count X", Range(1,3)) = 1
- [IntRange] _Ray_Marching_Cart_Instancing_Count_Y("Count Y", Range(1,3)) = 1
- [IntRange] _Ray_Marching_Cart_Instancing_Count_Z("Count Z", Range(1,3)) = 1
- _Ray_Marching_Cart_Instancing_Span_X("Span X", Range(0,2)) = 0.1
- _Ray_Marching_Cart_Instancing_Span_Y("Span Y", Range(0,2)) = 0.1
- _Ray_Marching_Cart_Instancing_Span_Z("Span Z", Range(0,2)) = 0.1
-
- //ifex _Ray_Marching_Cart_Instancing_Offsets_Enabled==0
- [HideInInspector] m_start_Ray_Marching_Cart_Instancing_Offsets("Offsets", Float) = 0
- [ThryToggle(_RAY_MARCHING_CART_INSTANCING_OFFSETS)] _Ray_Marching_Cart_Instancing_Offsets_Enabled("Enable", Float) = 0
- _Ray_Marching_Cart_Instancing_Offsets_X_Every_Y("X every Y", Range(0,1)) = 0
- _Ray_Marching_Cart_Instancing_Offsets_X_Every_Z("X every Z", Range(0,1)) = 0
- _Ray_Marching_Cart_Instancing_Offsets_Y_Every_X("Y every X", Range(0,1)) = 0
- _Ray_Marching_Cart_Instancing_Offsets_Y_Every_Z("Y every Z", Range(0,1)) = 0
- _Ray_Marching_Cart_Instancing_Offsets_Z_Every_X("Z every X", Range(0,1)) = 0
- _Ray_Marching_Cart_Instancing_Offsets_Z_Every_Y("Z every Y", Range(0,1)) = 0
- [HideInInspector] m_end_Ray_Marching_Cart_Instancing_Offsets("Offsets", Float) = 0
+ [HideInInspector] m_start_Ray_Marching_Instancing("Instancing and domain repetition", Float) = 0
+
+ //ifex _Ray_Marching_Cart_Instancing_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Cart_Instancing("Cartesian Instancing", Float) = 0
+ [ThryToggle(_RAY_MARCHING_CART_INSTANCING)] _Ray_Marching_Cart_Instancing_Enabled("Enable", Float) = 0
+ [IntRange] _Ray_Marching_Cart_Instancing_Count_X("Count X", Range(1,3)) = 1
+ [IntRange] _Ray_Marching_Cart_Instancing_Count_Y("Count Y", Range(1,3)) = 1
+ [IntRange] _Ray_Marching_Cart_Instancing_Count_Z("Count Z", Range(1,3)) = 1
+ _Ray_Marching_Cart_Instancing_Span_X("Span X", Range(0,2)) = 0.1
+ _Ray_Marching_Cart_Instancing_Span_Y("Span Y", Range(0,2)) = 0.1
+ _Ray_Marching_Cart_Instancing_Span_Z("Span Z", Range(0,2)) = 0.1
+
+ //ifex _Ray_Marching_Cart_Instancing_Offsets_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Cart_Instancing_Offsets("Offsets", Float) = 0
+ [ThryToggle(_RAY_MARCHING_CART_INSTANCING_OFFSETS)] _Ray_Marching_Cart_Instancing_Offsets_Enabled("Enable", Float) = 0
+ _Ray_Marching_Cart_Instancing_Offsets_X_Every_Y("X every Y", Range(0,1)) = 0
+ _Ray_Marching_Cart_Instancing_Offsets_X_Every_Z("X every Z", Range(0,1)) = 0
+ _Ray_Marching_Cart_Instancing_Offsets_Y_Every_X("Y every X", Range(0,1)) = 0
+ _Ray_Marching_Cart_Instancing_Offsets_Y_Every_Z("Y every Z", Range(0,1)) = 0
+ _Ray_Marching_Cart_Instancing_Offsets_Z_Every_X("Z every X", Range(0,1)) = 0
+ _Ray_Marching_Cart_Instancing_Offsets_Z_Every_Y("Z every Y", Range(0,1)) = 0
+ [HideInInspector] m_end_Ray_Marching_Cart_Instancing_Offsets("Offsets", Float) = 0
+ //endex
+ [HideInInspector] m_end_Ray_Marching_Cart_Instancing("Cartesian Instancing", Float) = 0
//endex
- [HideInInspector] m_end_Ray_Marching_Cart_Instancing("Cartesian Instancing", Float) = 0
- //endex
- //ifex _Ray_Marching_Cart_Grid_Enabled==0
- [HideInInspector] m_start_Ray_Marching_Cart_Grid("Cartesian Grid", Float) = 0
- [ThryToggle(_RAY_MARCHING_CART_GRID)] _Ray_Marching_Cart_Grid_Enabled("Enable", Float) = 0
- [IntRange] _Ray_Marching_Cart_Grid_Count_X("Count X", Range(0,40)) = 5
- [IntRange] _Ray_Marching_Cart_Grid_Count_Y("Count Y", Range(0,40)) = 5
- [IntRange] _Ray_Marching_Cart_Grid_Count_Z("Count Z", Range(0,40)) = 5
- _Ray_Marching_Cart_Grid_Span_X("Span X", Range(0,40)) = 0.1
- _Ray_Marching_Cart_Grid_Span_Y("Span Y", Range(0,40)) = 0.1
- _Ray_Marching_Cart_Grid_Span_Z("Span Z", Range(0,40)) = 0.1
- [HideInInspector] m_end_Ray_Marching_Cart_Grid("Cart Grid", Float) = 0
- //endex
+ //ifex _Ray_Marching_Cart_Grid_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Cart_Grid("Cartesian Domain Repetition", Float) = 0
+ [ThryToggle(_RAY_MARCHING_CART_GRID)] _Ray_Marching_Cart_Grid_Enabled("Enable", Float) = 0
+ [IntRange] _Ray_Marching_Cart_Grid_Count_X("Count X", Range(0,40)) = 5
+ [IntRange] _Ray_Marching_Cart_Grid_Count_Y("Count Y", Range(0,40)) = 5
+ [IntRange] _Ray_Marching_Cart_Grid_Count_Z("Count Z", Range(0,40)) = 5
+ _Ray_Marching_Cart_Grid_Span_X("Span X", Range(0,40)) = 0.1
+ _Ray_Marching_Cart_Grid_Span_Y("Span Y", Range(0,40)) = 0.1
+ _Ray_Marching_Cart_Grid_Span_Z("Span Z", Range(0,40)) = 0.1
+ [HideInInspector] m_end_Ray_Marching_Cart_Grid("Cartesian Domain Repetition", Float) = 0
+ //endex
- //ifex _Ray_Marching_Hex_Grid_Enabled==0
- [HideInInspector] m_start_Ray_Marching_Hex_Grid("Hex Grid", Float) = 0
- [ThryToggle(_RAY_MARCHING_HEX_GRID)] _Ray_Marching_Hex_Grid_Enabled("Enable", Float) = 0
- _Ray_Marching_Hex_Grid_Count("CountX", Range(0,40)) = 5
- [HideInInspector] m_end_Ray_Marching_Hex_Grid("Hex Grid", Float) = 0
+ //ifex _Ray_Marching_Hex_Grid_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Hex_Grid("Hexagonal Domain Repetition", Float) = 0
+ [ThryToggle(_RAY_MARCHING_HEX_GRID)] _Ray_Marching_Hex_Grid_Enabled("Enable", Float) = 0
+ _Ray_Marching_Hex_Grid_Count("CountX", Range(0,40)) = 5
+ [HideInInspector] m_end_Ray_Marching_Hex_Grid("Hexagonal Domain Repetition", Float) = 0
+ //endex
+ [HideInInspector] m_end_Ray_Marching_Instancing("Instancing and domain repetition", Float) = 0
+
+ //ifex _Ray_Marching_Scaling_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Scaling("Scaling", Float) = 0
+ [ThryToggle(_RAY_MARCHING_SCALING)] _Ray_Marching_Scaling_Enabled("Enable", Float) = 0
+ _Ray_Marching_Scaling_Factor_X("Factor X", Range(0.9,1.1)) = 1
+ _Ray_Marching_Scaling_Factor_Y("Factor Y", Range(0.9,1.1)) = 1
+ _Ray_Marching_Scaling_Factor_Z("Factor Z", Range(0.9,1.1)) = 1
+ [HideInInspector] m_end_Ray_Marching_Scaling("Scaling", Float) = 0
//endex
- //ifex _Ray_Marching_Ball_Enabled==0
- [HideInInspector] m_start_Ray_Marching_Ball("Ball", Float) = 0
- [ThryToggle(_RAY_MARCHING_BALL)] _Ray_Marching_Ball_Enabled("Enable", Float) = 0
- _Ray_Marching_Ball_Radius("Radius", Range(0,1)) = 1
- [HideInInspector] m_end_Ray_Marching_Ball("Ball", Float) = 0
- //endex
+ [HideInInspector] m_start_Ray_Marching_Primitives("Primitives", Float) = 0
+ //ifex _Ray_Marching_Ball_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Ball("Ball", Float) = 0
+ [ThryToggle(_RAY_MARCHING_BALL)] _Ray_Marching_Ball_Enabled("Enable", Float) = 0
+ _Ray_Marching_Ball_Radius("Radius", Range(0,1)) = 1
+ [HideInInspector] m_end_Ray_Marching_Ball("Ball", Float) = 0
+ //endex
- //ifex _Ray_Marching_Hexagon_Enabled==0
- [HideInInspector] m_start_Ray_Marching_Hexagon("Hexagon", Float) = 0
- [ThryToggle(_RAY_MARCHING_HEXAGON)] _Ray_Marching_Hexagon_Enabled("Enable", Float) = 0
- _Ray_Marching_Hexagon_Radius("Radius", Range(0,1)) = 0.1
- _Ray_Marching_Hexagon_Height("Height", Range(0,1)) = 0.1
- [HideInInspector] m_end_Ray_Marching_Hexagon("Hexagon", Float) = 0
- //endex
+ //ifex _Ray_Marching_Hexagon_Enabled==0
+ [HideInInspector] m_start_Ray_Marching_Hexagon("Hexagon", Float) = 0
+ [ThryToggle(_RAY_MARCHING_HEXAGON)] _Ray_Marching_Hexagon_Enabled("Enable", Float) = 0
+ _Ray_Marching_Hexagon_Radius("Radius", Range(0,1)) = 0.1
+ _Ray_Marching_Hexagon_Height("Height", Range(0,1)) = 0.1
+ [HideInInspector] m_end_Ray_Marching_Hexagon("Hexagon", Float) = 0
+ //endex
+ [HideInInspector] m_end_Ray_Marching_Primitives("Primitives", Float) = 0
+
+ [HideInInspector] m_end_Ray_Marching_Primitives("Primitives", Float) = 0
[HideInInspector] m_end_Ray_Marching("Ray Marching", Float) = 0
//endex
diff --git a/features.cginc b/features.cginc
index 39fc34a..1cd6a17 100644
--- a/features.cginc
+++ b/features.cginc
@@ -104,6 +104,10 @@
#pragma shader_feature_local _RAY_MARCHING_HEX_GRID
//endex
+//ifex _Ray_Marching_Scaling_Enabled==0
+#pragma shader_feature_local _RAY_MARCHING_SCALING
+//endex
+
//ifex _Ray_Marching_Ball_Enabled==0
#pragma shader_feature_local _RAY_MARCHING_BALL
//endex
diff --git a/globals.cginc b/globals.cginc
index c2b38cb..5f8f684 100644
--- a/globals.cginc
+++ b/globals.cginc
@@ -167,6 +167,12 @@ float _Ray_Marching_Hex_Grid_Radius;
float _Ray_Marching_Hex_Grid_Count;
#endif // _RAY_MARCHING_HEX_GRID
+#if defined(_RAY_MARCHING_SCALING)
+float _Ray_Marching_Scaling_Factor_X;
+float _Ray_Marching_Scaling_Factor_Y;
+float _Ray_Marching_Scaling_Factor_Z;
+#endif // _RAY_MARCHING_SCALING
+
#if defined(_RAY_MARCHING_BALL_GRID)
float _Ray_Marching_Ball_Grid_Radius;
float _Ray_Marching_Ball_Grid_Count_X;
diff --git a/ray_marching.cginc b/ray_marching.cginc
index 7b95972..aeb35a1 100644
--- a/ray_marching.cginc
+++ b/ray_marching.cginc
@@ -1,6 +1,8 @@
#ifndef __RAY_MARCHING_INC
#define __RAY_MARCHING_INC
+#if defined(_RAY_MARCHING)
+
#include "math.cginc"
#include "ray_marching_maps.hlsl"
#include "texture_utils.cginc"
@@ -25,6 +27,13 @@ void GetRoRd(v2f i, out float3 ro, out float3 rd) {
ro = getObjPos(i);
float3 rd_world = i.worldPos.xyz - _WorldSpaceCameraPos;
rd = normalize(mul(unity_WorldToObject, rd_world));
+#if defined(_RAY_MARCHING_SCALING)
+ float3 scale = float3(
+ _Ray_Marching_Scaling_Factor_X,
+ _Ray_Marching_Scaling_Factor_Y,
+ _Ray_Marching_Scaling_Factor_Z);
+ ro *= scale;
+#endif // _RAY_MARCHING_SCALING
}
float map(float3 p) {
@@ -146,7 +155,6 @@ float domain_repeat(inout float3 p) {
return d;
}
-#if defined(_RAY_MARCHING)
bool get_one_hit(float3 ro, float3 rd, out float3 hitPos, out float hitD) {
const float kMinDist = _Ray_Marching_Min_Dist;
const float kMaxDist = _Ray_Marching_Max_Dist;
@@ -202,7 +210,7 @@ bool get_hit(float3 ro, float3 rd, out float3 hitPos, out float hitD) {
count_minus_1.x * z_every_x + count_minus_1.y * z_every_y
);
const float3 offset_midpoint = max_offset * 0.5f;
-#endif
+#endif // _RAY_MARCHING_CART_INSTANCING_OFFSETS
hitD = 1e9;
for (uint xi = 0; xi < count.x; ++xi)
@@ -217,7 +225,7 @@ bool get_hit(float3 ro, float3 rd, out float3 hitPos, out float hitD) {
y_every_x * xi + y_every_z * zi,
z_every_x * xi + z_every_y * yi);
cur_pos += cur_offset - offset_midpoint;
-#endif
+#endif // _RAY_MARCHING_CART_INSTANCING_OFFSETS
if (!get_one_hit(cur_pos, rd, hitPos_tmp, hitD_tmp)) {
continue;
}
@@ -227,13 +235,13 @@ bool get_hit(float3 ro, float3 rd, out float3 hitPos, out float hitD) {
}
}
return hitD != 1e9;
-#else
+#else // !_RAY_MARCHING_CART_INSTANCING
return get_one_hit(ro, rd, hitPos, hitD);
-#endif
+#endif // _RAY_MARCHING_CART_INSTANCING
}
#endif // _RAY_MARCHING
-void ray_march(inout v2f i) {
+void ray_march(inout v2f i, bool is_fragment) {
#if defined(_RAY_MARCHING)
float3 ro, rd;
GetRoRd(i, ro, rd);
@@ -250,7 +258,10 @@ void ray_march(inout v2f i) {
float3 hit_pos;
float hit_d;
- if (!get_hit(ro, rd, hit_pos, hit_d)) {
+ // Fragment shader can discard pixels, and here it's desired.
+ // Vertex shader very well may not have hit anything, but that doesn't mean
+ // that the fragment shader can't finish the job.
+ if (!get_hit(ro, rd, hit_pos, hit_d) && is_fragment) {
discard;
}
@@ -272,15 +283,17 @@ void ray_march(inout v2f i) {
#endif
#if defined(_VERTEX_DEFORMATION)
- {
+ if (is_fragment) {
float3 tmp_pos = ro;
deform_normal(tmp_pos, lclNorm, lclTan);
}
#endif
i.objPos = lclPos;
- i.normal = lclNorm;
- i.tangent.xyz = lclTan;
+ if (is_fragment) {
+ i.normal = lclNorm;
+ i.tangent.xyz = lclTan;
+ }
#endif // _RAY_MARCHING
}
diff --git a/vertex_deformation.slang b/vertex_deformation.slang
index 36d09fb..047f7d7 100644
--- a/vertex_deformation.slang
+++ b/vertex_deformation.slang
@@ -197,7 +197,7 @@ float3 rand3_hash3(float3 p)
p = float3(dot(p, float3(127.1, 311.7, 74.7)),
dot(p, float3(269.5, 183.3, 246.1)),
dot(p, float3(113.5, 271.9, 124.6)));
- return frac(sin(p) * 43758.5453123)*2-1;
+ return frac(sin(p) * 43758.5453123);
}
[Differentiable]