diff options
| author | yum <yum.food.vr@gmail.com> | 2024-09-10 23:45:40 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-09-10 23:45:40 -0700 |
| commit | dfb1ece3e78cf013866d18a3a234e2f4bf8834f8 (patch) | |
| tree | 81bbb45d39d6e2758b9b62632a4873821ac8d278 | |
| parent | 2712f07c0d06a15e6624b3045207d301a1592886 (diff) | |
Start work on new halo tech
| -rw-r--r-- | Editor/tooner.cs | 20 | ||||
| -rw-r--r-- | feature_macros.cginc | 1 | ||||
| -rw-r--r-- | halos.cginc | 137 | ||||
| -rw-r--r-- | tooner.shader | 8 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 33 |
5 files changed, 184 insertions, 15 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index c1c4331..a5f4757 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -1356,6 +1356,25 @@ public class ToonerGUI : ShaderGUI { EditorGUI.indentLevel -= 1; } + void DoGimmickHalo00() { + MaterialProperty bc; + bc = FindProperty("_Gimmick_Halo00_Enable_Static"); + bool enabled = (bc.floatValue != 0.0); + EditorGUI.BeginChangeCheck(); + enabled = EditorGUILayout.Toggle("Halo 00", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + SetKeyword("_GIMMICK_HALO_00", enabled); + + if (!enabled) { + return; + } + + EditorGUI.indentLevel += 1; + + EditorGUI.indentLevel -= 1; + } + void DoGimmickPixellate() { MaterialProperty bc; bc = FindProperty("_Gimmick_Pixellate_Enable_Static"); @@ -1536,6 +1555,7 @@ public class ToonerGUI : ShaderGUI { DoGimmickSpherizeLocation(); DoGimmickEyes00(); DoGimmickEyes01(); + DoGimmickHalo00(); DoGimmickPixellate(); DoGimmickTrochoid(); DoGimmickFaceMeWorldY(); diff --git a/feature_macros.cginc b/feature_macros.cginc index cdae09d..f4857a6 100644 --- a/feature_macros.cginc +++ b/feature_macros.cginc @@ -140,6 +140,7 @@ #pragma shader_feature_local _ _GIMMICK_SPHERIZE_LOCATION #pragma shader_feature_local _ _GIMMICK_EYES_00 #pragma shader_feature_local _ _GIMMICK_EYES_01 +#pragma shader_feature_local _ _GIMMICK_HALO_00 #pragma shader_feature_local _ _PIXELLATE #pragma shader_feature_local _ _TROCHOID #pragma shader_feature_local _ _FACE_ME_WORLD_Y diff --git a/halos.cginc b/halos.cginc new file mode 100644 index 0000000..aa0b731 --- /dev/null +++ b/halos.cginc @@ -0,0 +1,137 @@ +#ifndef __HALOS_INC +#define __HALOS_INC + +#include "globals.cginc" +#include "interpolators.cginc" +#include "math.cginc" + +#if defined(_GIMMICK_HALO_00) +struct Halo00Params { + float3 period; + float3 count; + float2 uv; +}; +struct Halo00PBR { + float4 albedo; + float3 normal; +}; + +float halo00_map(float3 p, float2 e) +{ + return length(p) - 0.1; +} + +float halo00_map_dr( + float3 p, + Halo00Params params, + out float3 which + ) +{ + which = round(p / params.period); + // Direction to nearest neighboring cell. + float3 min_d = p - params.period * which; + float3 o = sign(min_d); + + float d = 1E9; + float3 which_tmp = which; + for (int xi = 0; xi < 1; xi++) + for (int yi = 0; yi < 1; yi++) + { + float3 rid = which + float3(xi, yi, 0) * o; + rid = clamp(rid, ceil(-(params.count)*0.5), floor((params.count-1)*0.5)); + float3 r = p - params.period * rid; + float2 e = 0; + /* + float2 e = float2( + rand3(rid / 100.0), + rand3(rid / 100.0 + 1)); + */ + float cur_d = halo00_map(r, e); + which_tmp = + (cur_d < d ? rid : which_tmp); + d = min(d, cur_d); + } + + which = which_tmp; + return d; +} + +float3 halo00_calc_normal(float3 p, Halo00Params params) +{ + const float3 small_step = float3(0.0001, 0.0, 0.0); + + // TODO do we need full central differences? + float3 which; + float gradient_x = halo00_map_dr(p + small_step.xyy, params, which) - + halo00_map_dr(p - small_step.xyy, params, which); + float gradient_y = halo00_map_dr(p + small_step.yxy, params, which) - + halo00_map_dr(p - small_step.yxy, params, which); + float gradient_z = halo00_map_dr(p + small_step.yyx, params, which) - + halo00_map_dr(p - small_step.yyx, params, which); + + float3 normal = float3(gradient_x, gradient_y, gradient_z); + + return normalize(normal); +} + +void __halo00_march(float3 ro, float3 rd, Halo00Params params, out Halo00PBR result) +{ + float total_distance_traveled = 0.0; + const float MINIMUM_HIT_DISTANCE = 0.001; + const float MAXIMUM_TRACE_DISTANCE = 10.0; + + ro -= (1 - (params.count % 2)) * params.period * 0.5; + +#define HALO00_MARCH_STEPS 30 + float distance_to_closest; + float3 current_position; + float3 which; + for (int i = 0; i < HALO00_MARCH_STEPS; i++) + { + current_position = ro + total_distance_traveled * rd; + + distance_to_closest = halo00_map_dr(current_position, params, which); + + if (distance_to_closest < MINIMUM_HIT_DISTANCE) + { + break; + } + + if (total_distance_traveled > MAXIMUM_TRACE_DISTANCE) + { + break; + } + total_distance_traveled += distance_to_closest; + } + + if (distance_to_closest < MINIMUM_HIT_DISTANCE) { + result.albedo = 1; + result.normal = halo00_calc_normal(current_position, params); + return; + } + + result.albedo = 0; + result.normal = 0; + return; +} + +Halo00PBR halo00_march(float3 worldPos, float2 uv) +{ + Halo00PBR result; + Halo00Params params; + params.period = 0.2; + params.count = 5; + params.uv = uv; + + float3 camera_position = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1)); + float3 ro = camera_position; + float3 rd = normalize(mul(unity_WorldToObject, float4(worldPos - _WorldSpaceCameraPos.xyz, 1))); + + __halo00_march(ro, rd, params, result); + + return result; +} + +#endif // _GIMMICK_HALO_00 + +#endif // _HALOS_INC diff --git a/tooner.shader b/tooner.shader index cbb14b5..2cdfde7 100644 --- a/tooner.shader +++ b/tooner.shader @@ -3,7 +3,7 @@ Shader "yum_food/tooner" // Unity fucking sucks ass and sometimes incorrectly uses an old cached // version of the shader. Bump the nonce below to encourage it to use the // current version. - // Build nonce: 18 + // Build nonce: 19 Properties { _Color("Base color", Color) = (0.8, 0.8, 0.8, 1) @@ -187,7 +187,7 @@ Shader "yum_food/tooner" _Proximity_Dimming_Factor("Proximity dimming max distance", Float) = 0 _Shading_Mode("Shading mode", Range(0, 1)) = 0 - _Mesh_Normals_Mode("Normals mode", Float) = 0.0 + _Mesh_Normals_Mode("Normals mode", Float) = 3 _Flatten_Mesh_Normals_Str("Flatten mesh normals strength", Float) = 100.0 [MaterialToggle] _Confabulate_Normals("Confabulate mesh normals", Float) = 0.0 @@ -457,6 +457,8 @@ Shader "yum_food/tooner" _Gimmick_Eyes01_Enable_Static("Enable eyes 01", Float) = 0.0 _Gimmick_Eyes01_Radius("Radius (meters, obj space)", Float) = 1.0 + _Gimmick_Halo00_Enable_Static("Enable halo", Float) = 0.0 + _Gimmick_Pixellate_Enable_Static("Enable pixellation", Float) = 0.0 _Gimmick_Pixellate_Resolution_U("Resolution (U)", Float) = 64 _Gimmick_Pixellate_Resolution_V("Resolution (V)", Float) = 64 @@ -557,6 +559,7 @@ Shader "yum_food/tooner" #include "tooner_lighting.cginc" ENDCG } + /* Pass { Tags { "RenderType"="Opaque" @@ -636,6 +639,7 @@ Shader "yum_food/tooner" #include "mochie_shadow_caster.cginc" ENDCG } + */ } CustomEditor "ToonerGUI" } diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 3a49112..8c03644 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -7,6 +7,7 @@ #include "clones.cginc" #include "eyes.cginc" #include "globals.cginc" +#include "halos.cginc" #include "interpolators.cginc" #include "iq_sdf.cginc" #include "math.cginc" @@ -374,7 +375,6 @@ void geom(triangle v2f tri_in[3], struct RorschachPBR { float4 albedo; }; - float rorschach_map_sdf(float3 p, float2 e, float3 period, float center_randomization) { float r = _Rorschach_Radius * min(period.x, min(period.y, period.z)); @@ -393,7 +393,6 @@ float rorschach_map_dr( float3 period, float3 count, float center_randomization, - float2 uv, out float3 which ) { @@ -442,7 +441,7 @@ RorschachPBR get_rorschach(float2 uv, RorschachParams p) float3 which; float3 period = float3(1 / (p.count_x+1), 1 / (p.count_y+1), 1); float3 count = float3(p.count_x, p.count_y, 1); - float d = rorschach_map_dr(ro, period, count, p.center_randomization, uv, which); + float d = rorschach_map_dr(ro, period, count, p.center_randomization, which); d *= max(p.count_x + 1, p.count_y + 1); @@ -1318,16 +1317,6 @@ float4 effect(inout v2f i) } #endif -#if defined(_RENDERING_CUTOUT) -#if defined(_RENDERING_CUTOUT_STOCHASTIC) - float ar = rand2(i.uv0); - clip(albedo.a - ar); -#else - clip(albedo.a - _Alpha_Cutoff); -#endif - albedo.a = 1; -#endif - PbrOverlay ov; getOverlayAlbedoRoughnessMetallic(ov, i); @@ -1352,6 +1341,24 @@ float4 effect(inout v2f i) raw_normal.z * i.normal ); +#if defined(_GIMMICK_HALO_00) + { + Halo00PBR pbr = halo00_march(i.worldPos, i.uv0); + albedo = pbr.albedo; + normal = pbr.normal; + } +#endif + +#if defined(_RENDERING_CUTOUT) +#if defined(_RENDERING_CUTOUT_STOCHASTIC) + float ar = rand2(i.uv0); + clip(albedo.a - ar); +#else + clip(albedo.a - _Alpha_Cutoff); +#endif + albedo.a = 1; +#endif + #if defined(_METALLIC_MAP) float metallic = _MetallicTex.SampleBias(GET_SAMPLER_PBR, UV_SCOFF(i, _MetallicTex_ST, 0), _Global_Sample_Bias); |
