diff options
| author | yum <yum.food.vr@gmail.com> | 2025-11-04 21:50:42 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-11-04 21:50:42 -0800 |
| commit | 672a7acca1f0401de7ac0ac94d3379081fa363e6 (patch) | |
| tree | 1fed9ab4791de35d9fdc69bdff437fea2223349e | |
| parent | ac78ce59232f698dfd721b0048336cd346612613 (diff) | |
begin work on marching in vert/domain shaders (NOT WORKING)
| -rw-r--r-- | 3ner.cginc | 3 | ||||
| -rw-r--r-- | 3ner.shader | 118 | ||||
| -rw-r--r-- | features.cginc | 4 | ||||
| -rw-r--r-- | globals.cginc | 6 | ||||
| -rw-r--r-- | ray_marching.cginc | 33 | ||||
| -rw-r--r-- | vertex_deformation.slang | 2 |
6 files changed, 103 insertions, 63 deletions
@@ -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] |
