diff options
| author | yum <yum.food.vr@gmail.com> | 2024-08-20 15:42:42 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-08-20 15:42:42 -0700 |
| commit | 1edac7f959f4763ccacce2329da4c1b8dc93b4c4 (patch) | |
| tree | df8efd94f2fe6562bf0e073dfcc9631737d8085c | |
| parent | d973a2d9fe3d380b04550bc68075b9d8c369cc10 (diff) | |
Implement UV channel selection for matcap normals
Also fix how normals get blended with matcap mix slider.
| -rw-r--r-- | Editor/tooner.cs | 5 | ||||
| -rw-r--r-- | globals.cginc | 2 | ||||
| -rw-r--r-- | tooner.shader | 2 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 49 | ||||
| -rw-r--r-- | tooner_outline_pass.cginc | 2 |
5 files changed, 37 insertions, 23 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 4d96d76..b51facb 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -514,6 +514,11 @@ public class ToonerGUI : ShaderGUI { bc = FindProperty($"_Matcap{i}Normal_Str"); editor.RangeProperty(bc, "Strength"); + + bc = FindProperty($"_Matcap{i}Normal_UV_Select"); + editor.RangeProperty( + bc, + "UV channel"); } EditorGUI.indentLevel -= 1; } diff --git a/globals.cginc b/globals.cginc index 4bedf19..e070f7d 100644 --- a/globals.cginc +++ b/globals.cginc @@ -313,6 +313,7 @@ float _Matcap0Emission; texture2D _Matcap0Normal; float4 _Matcap0Normal_ST; float _Matcap0Normal_Str; +float _Matcap0Normal_UV_Select; #endif #endif @@ -332,6 +333,7 @@ float _Matcap1Emission; texture2D _Matcap1Normal; float4 _Matcap1Normal_ST; float _Matcap1Normal_Str; +float _Matcap1Normal_UV_Select; #endif #endif diff --git a/tooner.shader b/tooner.shader index 0649d08..9131702 100644 --- a/tooner.shader +++ b/tooner.shader @@ -225,6 +225,7 @@ Shader "yum_food/tooner" _Matcap0Normal_Enabled("Enable normal replacement", Float) = 0 _Matcap0Normal("Matcap normals", 2D) = "bump" {} _Matcap0Normal_Str("Matcap normals", Range(0, 10)) = 1 + _Matcap0Normal_UV_Select("Matcap normals", Range(0, 3)) = 0 _Matcap1("Matcap", 2D) = "black" {} _Matcap1_Mask("Matcap mask", 2D) = "white" {} @@ -240,6 +241,7 @@ Shader "yum_food/tooner" _Matcap1Normal_Enabled("Enable normal replacement", Float) = 0 _Matcap1Normal("Matcap normals", 2D) = "bump" {} _Matcap1Normal_Str("Matcap normals", Range(0, 10)) = 1 + _Matcap1Normal_UV_Select("Matcap normals", Range(0, 3)) = 0 _Rim_Lighting0_Enabled("Enable rim lighting", Float) = 0 _Rim_Lighting0_Mode("Rim lighting mode", Float) = 0 diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 98b173e..1abf2bc 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -18,6 +18,13 @@ #include "trochoid_math.cginc" #include "oklab.cginc" +// Hacky parameterizable whiteout blending. Probably some big mistakes but it +// passes the eyeball test. +// At w=0.5, this looks kinda like whiteout blending. +// At w=0, this returns n0. +// At w=1, this returns n1. +#define MY_BLEND_NORMALS(n0, n1, w) normalize(float3((n0.xy * (1 - w) + n1.xy * w), lerp(1, n0.z, (1-w)) * lerp(1, n1.z, w))) + void getVertexLightColor(inout v2f i) { #if defined(VERTEXLIGHT_ON) @@ -164,6 +171,8 @@ v2f vert(appdata v) o.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w); o.uv0 = v.uv0; o.uv1 = v.uv1; + o.uv2 = v.uv2; + o.uv3 = v.uv3; #if defined(LIGHTMAP_ON) o.lmuv = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw; #endif @@ -1254,8 +1263,6 @@ float4 effect(inout v2f i) float matcap_overwrite_mask = 0; #if defined(_MATCAP0) || defined(_MATCAP1) { - float iddx = ddx(i.uv0.x); - float iddy = ddy(i.uv0.y); #if defined(_MATCAP0) { #if defined(_MATCAP0_MASK) @@ -1277,12 +1284,10 @@ float4 effect(inout v2f i) #endif #if defined(_MATCAP0_NORMAL) float3 matcap_normal = UnpackScaleNormal( - _Matcap0Normal.SampleGrad(linear_repeat_s, - UV_SCOFF(i, _Matcap0Normal_ST, /*uv_channel=*/0), - iddx * _Matcap0Normal_ST.x, - iddy * _Matcap0Normal_ST.y), - _Matcap0Normal_Str); - raw_normal = (round(matcap_mask) == 1 ? matcap_normal : raw_normal); + _Matcap0Normal.Sample(linear_repeat_s, + UV_SCOFF(i, _Matcap0Normal_ST, _Matcap0Normal_UV_Select)), + _Matcap0Normal_Str * _Matcap0MixFactor); + raw_normal = MY_BLEND_NORMALS(raw_normal, matcap_normal, matcap_mask * _Matcap0MixFactor); normal = float3( raw_normal.x * i.tangent + raw_normal.y * binormal + @@ -1306,7 +1311,7 @@ float4 effect(inout v2f i) float2 distort_uv = matcap_distortion0(matcap_uv); float2 matcap_uv = distort_uv; #endif - float3 matcap = _Matcap0.SampleGrad(linear_repeat_s, matcap_uv, iddx, iddy) * _Matcap0Str; + float3 matcap = _Matcap0.Sample(linear_repeat_s, matcap_uv) * _Matcap0Str; float q = _Matcap0Quantization; if (q > 0) { @@ -1366,12 +1371,10 @@ float4 effect(inout v2f i) #endif #if defined(_MATCAP1_NORMAL) float3 matcap_normal = UnpackScaleNormal( - _Matcap1Normal.SampleGrad(linear_repeat_s, - UV_SCOFF(i, _Matcap1Normal_ST, /*uv_channel=*/0), - iddx * _Matcap1Normal_ST.x, - iddy * _Matcap1Normal_ST.y), + _Matcap1Normal.Sample(linear_repeat_s, + UV_SCOFF(i, _Matcap1Normal_ST, _Matcap1Normal_UV_Select)), _Matcap1Normal_Str * _Matcap1MixFactor); - raw_normal = (round(matcap_mask) == 1 ? matcap_normal : raw_normal); + raw_normal = MY_BLEND_NORMALS(raw_normal, matcap_normal, matcap_mask * _Matcap1MixFactor); normal = float3( raw_normal.x * i.tangent + raw_normal.y * binormal + @@ -1394,7 +1397,7 @@ float4 effect(inout v2f i) float2 distort_uv = matcap_distortion0(matcap_uv); float2 matcap_uv = distort_uv; #endif - float3 matcap = _Matcap1.SampleGrad(linear_repeat_s, matcap_uv, iddx, iddy) * _Matcap1Str; + float3 matcap = _Matcap1.Sample(linear_repeat_s, matcap_uv) * _Matcap1Str; float q = _Matcap1Quantization; if (q > 0) { @@ -1463,8 +1466,8 @@ float4 effect(inout v2f i) float3 matcap = rl * _Rim_Lighting0_Color * _Rim_Lighting0_Strength; #if defined(_RIM_LIGHTING0_MASK) - float4 matcap_mask_raw = _Rim_Lighting0_Mask.SampleGrad(GET_SAMPLER_RL0, - GET_UV_BY_CHANNEL(i, _Rim_Lighting0_Mask_UV_Select), iddx, iddy); + float4 matcap_mask_raw = _Rim_Lighting0_Mask.Sample(GET_SAMPLER_RL0, + GET_UV_BY_CHANNEL(i, _Rim_Lighting0_Mask_UV_Select)); float matcap_mask = matcap_mask_raw.r; matcap_mask = (bool) round(_Rim_Lighting0_Mask_Invert) ? 1 - matcap_mask : matcap_mask; matcap_mask *= matcap_mask_raw.a; @@ -1527,8 +1530,8 @@ float4 effect(inout v2f i) } float3 matcap = rl * _Rim_Lighting1_Color * _Rim_Lighting1_Strength; #if defined(_RIM_LIGHTING1_MASK) - float4 matcap_mask_raw = _Rim_Lighting1_Mask.SampleGrad(GET_SAMPLER_RL1, - GET_UV_BY_CHANNEL(i, _Rim_Lighting1_Mask_UV_Select), iddx, iddy); + float4 matcap_mask_raw = _Rim_Lighting1_Mask.Sample(GET_SAMPLER_RL1, + GET_UV_BY_CHANNEL(i, _Rim_Lighting1_Mask_UV_Select)); float matcap_mask = matcap_mask_raw.r; matcap_mask = (bool) round(_Rim_Lighting1_Mask_Invert) ? 1 - matcap_mask : matcap_mask; matcap_mask *= matcap_mask_raw.a; @@ -1595,8 +1598,8 @@ float4 effect(inout v2f i) } float3 matcap = rl * _Rim_Lighting2_Color * _Rim_Lighting2_Strength; #if defined(_RIM_LIGHTING2_MASK) - float4 matcap_mask_raw = _Rim_Lighting2_Mask.SampleGrad(GET_SAMPLER_RL2, - GET_UV_BY_CHANNEL(i, _Rim_Lighting2_Mask_UV_Select), iddx, iddy); + float4 matcap_mask_raw = _Rim_Lighting2_Mask.Sample(GET_SAMPLER_RL2, + GET_UV_BY_CHANNEL(i, _Rim_Lighting2_Mask_UV_Select)); float matcap_mask = matcap_mask_raw.r; matcap_mask = (bool) round(_Rim_Lighting2_Mask_Invert) ? 1 - matcap_mask : matcap_mask; matcap_mask *= matcap_mask_raw.a; @@ -1663,8 +1666,8 @@ float4 effect(inout v2f i) } float3 matcap = rl * _Rim_Lighting3_Color * _Rim_Lighting3_Strength; #if defined(_RIM_LIGHTING3_MASK) - float4 matcap_mask_raw = _Rim_Lighting3_Mask.SampleGrad(GET_SAMPLER_RL3, - GET_UV_BY_CHANNEL(i, _Rim_Lighting3_Mask_UV_Select), iddx, iddy); + float4 matcap_mask_raw = _Rim_Lighting3_Mask.Sample(GET_SAMPLER_RL3, + GET_UV_BY_CHANNEL(i, _Rim_Lighting3_Mask_UV_Select)); float matcap_mask = matcap_mask_raw.r; matcap_mask = (bool) round(_Rim_Lighting3_Mask_Invert) ? 1 - matcap_mask : matcap_mask; matcap_mask *= matcap_mask_raw.a; diff --git a/tooner_outline_pass.cginc b/tooner_outline_pass.cginc index 1c1751b..2330828 100644 --- a/tooner_outline_pass.cginc +++ b/tooner_outline_pass.cginc @@ -71,6 +71,8 @@ v2f vert(appdata v) o.normal = UnityObjectToWorldNormal(v.normal); o.uv0 = v.uv0.xy; o.uv1 = v.uv1; + o.uv2 = v.uv2; + o.uv3 = v.uv3; #if defined(LIGHTMAP_ON) o.lmuv = v.uv1 * unity_LightmapST.xy + unity_LightmapST.zw; #endif |
