diff options
| author | yum <yum.food.vr@gmail.com> | 2024-05-22 13:45:14 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2024-05-22 13:45:14 -0700 |
| commit | cb54d0f9ad63f8937e7834e8e871999447f6e523 (patch) | |
| tree | d8d63001e4db2f1b0057b46432149f7f937adb4b | |
| parent | a942266a189d2c7b985f812536bb7b654121848a (diff) | |
Add matcap/rim lighting emissions, matcap distortion
| -rw-r--r-- | Editor/tooner.cs | 23 | ||||
| -rw-r--r-- | globals.cginc | 4 | ||||
| -rw-r--r-- | tooner.shader | 16 | ||||
| -rw-r--r-- | tooner_lighting.cginc | 58 |
4 files changed, 92 insertions, 9 deletions
diff --git a/Editor/tooner.cs b/Editor/tooner.cs index a9d53b5..9409dbc 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -132,7 +132,7 @@ public class ToonerGUI : ShaderGUI { void DoCubemap() { MaterialProperty bc = FindProperty("_Cubemap"); editor.TexturePropertySingleLine( - MakeLabel(bc, "Specular override cubemap"), + MakeLabel(bc, "Cubemap"), bc); SetKeyword("_CUBEMAP", bc.textureValue); } @@ -194,9 +194,10 @@ public class ToonerGUI : ShaderGUI { bc); SetKeyword($"_MATCAP{i}_MASK", bc.textureValue); + bool enabled; // c# is a shitty language if (bc.textureValue) { bc = FindProperty($"_Matcap{i}_Mask_Invert"); - bool enabled = bc.floatValue > 1E-6; + enabled = bc.floatValue > 1E-6; EditorGUI.BeginChangeCheck(); enabled = EditorGUILayout.Toggle("Invert mask", enabled); EditorGUI.EndChangeCheck(); @@ -219,7 +220,20 @@ public class ToonerGUI : ShaderGUI { editor.FloatProperty( bc, "Matcap strength"); + + bc = FindProperty($"_Matcap{i}Emission"); + editor.FloatProperty( + bc, + "Emission strength"); EditorGUI.indentLevel -= 1; + + bc = FindProperty($"_Matcap{i}Distortion0"); + enabled = bc.floatValue > 1E-6; + EditorGUI.BeginChangeCheck(); + enabled = EditorGUILayout.Toggle("Enable distortion 0", enabled); + EditorGUI.EndChangeCheck(); + bc.floatValue = enabled ? 1.0f : 0.0f; + SetKeyword($"_MATCAP{i}_DISTORTION0", enabled); } } @@ -287,6 +301,11 @@ public class ToonerGUI : ShaderGUI { bc, "Strength"); + bc = FindProperty($"_Rim_Lighting{i}_Emission"); + editor.FloatProperty( + bc, + "Rim lighting emission"); + EditorGUI.indentLevel -= 1; } } diff --git a/globals.cginc b/globals.cginc index 2ed4be1..275326c 100644 --- a/globals.cginc +++ b/globals.cginc @@ -70,6 +70,7 @@ texture2D _Matcap0_Mask; float _Matcap0_Mask_Invert; float _Matcap0Str; float _Matcap0Mode; +float _Matcap0Emission; float _Enable_Matcap1; texture2D _Matcap1; @@ -77,6 +78,7 @@ texture2D _Matcap1_Mask; float _Matcap1_Mask_Invert; float _Matcap1Str; float _Matcap1Mode; +float _Matcap1Emission; float _Rim_Lighting0_Enabled; float _Rim_Lighting0_Mode; @@ -86,6 +88,7 @@ float _Rim_Lighting0_Mask_Invert; float _Rim_Lighting0_Center; float _Rim_Lighting0_Power; float _Rim_Lighting0_Strength; +float _Rim_Lighting0_Emission; float _Rim_Lighting1_Enabled; float _Rim_Lighting1_Mode; @@ -95,6 +98,7 @@ float _Rim_Lighting1_Mask_Invert; float _Rim_Lighting1_Center; float _Rim_Lighting1_Power; float _Rim_Lighting1_Strength; +float _Rim_Lighting1_Emission; float _OKLAB_Enabled; texture2D _OKLAB_Mask; diff --git a/tooner.shader b/tooner.shader index 2a964c6..c97b700 100644 --- a/tooner.shader +++ b/tooner.shader @@ -26,7 +26,7 @@ Shader "yum_food/tooner" [NoScaleOffset] _Tex_NormalStr("Normal texture strength", Range(0, 10)) = 1 - _Cubemap("Specular override (cubemap)", Cube) = "" {} + _Cubemap("Cubemap", Cube) = "" {} _Min_Brightness("Min brightness", Range(0, 1)) = 0 _Max_Brightness("Max brightness", Range(0, 1.5)) = 1 _Mesh_Normal_Strength("Mesh normal strength", Range(0, 10)) = 1 @@ -75,12 +75,16 @@ Shader "yum_food/tooner" _Matcap0_Mask_Invert("Invert mask", Float) = 0.0 _Matcap0Mode("Matcap mode", Float) = 0 _Matcap0Str("Matcap strength", Float) = 1 + _Matcap0Emission("Matcap emission", Float) = 0 + _Matcap0Distortion0("Matcap distortion0", Float) = 0 _Matcap1("Matcap", 2D) = "black" {} _Matcap1_Mask("Matcap mask", 2D) = "white" {} _Matcap1_Mask_Invert("Invert mask", Float) = 0.0 _Matcap1Mode("Matcap mode", Float) = 0 _Matcap1Str("Matcap strength", Float) = 1 + _Matcap1Emission("Matcap emission", Float) = 0 + _Matcap1Distortion0("Matcap distortion0", Float) = 0 _Rim_Lighting0_Enabled("Enable rim lighting", Float) = 0 _Rim_Lighting0_Mode("Rim lighting mode", Float) = 0 @@ -89,7 +93,8 @@ Shader "yum_food/tooner" _Rim_Lighting0_Color("Rim lighting color", Color) = (1, 1, 1, 1) _Rim_Lighting0_Center("Rim lighting center", Float) = 0.5 _Rim_Lighting0_Power("Rim lighting power", Float) = 2.0 - _Rim_Lighting0_Strength("Rim lighting power", Float) = 1.0 + _Rim_Lighting0_Strength("Rim lighting strength", Float) = 1.0 + _Rim_Lighting0_Emission("Rim lighting emission", Float) = 0 _Rim_Lighting1_Enabled("Enable rim lighting", Float) = 0 _Rim_Lighting1_Mode("Rim lighting mode", Float) = 0 @@ -98,7 +103,8 @@ Shader "yum_food/tooner" _Rim_Lighting1_Color("Rim lighting color", Color) = (1, 1, 1, 1) _Rim_Lighting1_Center("Rim lighting center", Float) = 0.5 _Rim_Lighting1_Power("Rim lighting power", Float) = 2.0 - _Rim_Lighting1_Strength("Rim lighting power", Float) = 1.0 + _Rim_Lighting1_Strength("Rim lighting strength", Float) = 1.0 + _Rim_Lighting1_Emission("Rim lighting emission", Float) = 0 _OKLAB_Enabled("Enable OKLAB", Float) = 0.0 _OKLAB_Mask("Mask", 2D) = "white" {} @@ -180,6 +186,8 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _PBR_OVERLAY_METALLIC_MAP #pragma shader_feature_local _ _LTCGI #pragma shader_feature_local _ _TESSELLATION + #pragma shader_feature_local _ _MATCAP0_DISTORTION0 + #pragma shader_feature_local _ _MATCAP1_DISTORTION0 #pragma vertex vert //#pragma vertex hull_vertex @@ -241,6 +249,8 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _PBR_OVERLAY_METALLIC_MAP #pragma shader_feature_local _ _LTCGI #pragma shader_feature_local _ _TESSELLATION + #pragma shader_feature_local _ _MATCAP0_DISTORTION0 + #pragma shader_feature_local _ _MATCAP1_DISTORTION0 #pragma vertex vert //#pragma vertex hull_vertex diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index ec72ac6..0b054f2 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -374,6 +374,17 @@ float3 CreateBinormal (float3 normal, float3 tangent, float binormalSign) { (binormalSign * unity_WorldTransformParams.w); } +float2 matcap_distortion0(float2 matcap_uv) { + float3 qvec = float3(matcap_uv * 2 - 1, 0); + float t = _Time[0]; + float e = .4; + float3 qaxis = normalize(float3(sin(t * 2.3) * e, sin(t * 2.9) * e * 1.2, 1)); + float qtheta = t; + float4 quat = get_quaternion(qaxis, qtheta); + matcap_uv *= ((rotate_vector(qvec, quat) + 1) / 2).xy * 1.3; + return matcap_uv; +} + float4 effect(inout v2f i) { float iddx = ddx(i.uv.x) / 4; @@ -475,6 +486,10 @@ float4 effect(inout v2f i) albedo.rgb = lerp(albedo.rgb, ov_albedo.rgb, ov_albedo.a); #endif // _PBR_OVERLAY +#if defined(_MATCAP0) || defined(_MATCAP1) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) + float3 matcap_emission = 0; +#endif + #if defined(_MATCAP0) || defined(_MATCAP1) { const float3 cam_normal = normalize(mul(UNITY_MATRIX_V, float4(normal, 0))); @@ -489,6 +504,10 @@ float4 effect(inout v2f i) float iddy = ddy(i.uv.y); { #if defined(_MATCAP0) +#if defined(_MATCAP0_DISTORTION0) + 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; #if defined(_MATCAP0_MASK) @@ -504,21 +523,27 @@ float4 effect(inout v2f i) switch (mode) { case 0: albedo.rgb += lerp(0, matcap, matcap_mask); + matcap_emission += lerp(0, matcap, matcap_mask) * _Matcap0Emission; break; case 1: + matcap_emission = lerp(1, matcap, matcap_mask) * _Matcap0Emission; albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: - albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask);; + albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); + matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Matcap0Emission; break; case 3: albedo.rgb -= lerp(0, matcap, matcap_mask); + matcap_emission -= lerp(0, matcap, matcap_mask) * _Matcap0Emission; break; case 4: albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask) * _Matcap0Emission; break; case 5: albedo.rgb = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask) * _Matcap0Emission; break; default: break; @@ -527,6 +552,10 @@ float4 effect(inout v2f i) } { #if defined(_MATCAP1) +#if defined(_MATCAP1_DISTORTION0) + 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; #if defined(_MATCAP1_MASK) @@ -542,21 +571,27 @@ float4 effect(inout v2f i) switch (mode) { case 0: albedo.rgb += lerp(0, matcap, matcap_mask); + matcap_emission += lerp(0, matcap, matcap_mask) * _Matcap1Emission; break; case 1: + matcap_emission = lerp(1, matcap, matcap_mask) * _Matcap1Emission; albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: - albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask);; + albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); + matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Matcap1Emission; break; case 3: albedo.rgb -= lerp(0, matcap, matcap_mask); + matcap_emission -= lerp(0, matcap, matcap_mask) * _Matcap1Emission; break; case 4: albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask) * _Matcap1Emission; break; case 5: albedo.rgb = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask) * _Matcap1Emission; break; default: break; @@ -588,21 +623,27 @@ float4 effect(inout v2f i) switch (mode) { case 0: albedo.rgb += lerp(0, matcap, matcap_mask); + matcap_emission += lerp(0, matcap, matcap_mask) * _Rim_Lighting0_Emission; break; case 1: + matcap_emission = albedo.rgb * lerp(1, matcap, matcap_mask) * _Rim_Lighting0_Emission; albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: - albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask);; + albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); + matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Rim_Lighting0_Emission; break; case 3: albedo.rgb -= lerp(0, matcap, matcap_mask); + matcap_emission -= lerp(0, matcap, matcap_mask) * _Rim_Lighting0_Emission; break; case 4: albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting0_Emission; break; case 5: albedo.rgb = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting0_Emission; break; default: break; @@ -626,21 +667,27 @@ float4 effect(inout v2f i) switch (mode) { case 0: albedo.rgb += lerp(0, matcap, matcap_mask); + matcap_emission += lerp(0, matcap, matcap_mask) * _Rim_Lighting1_Emission; break; case 1: + matcap_emission = albedo.rgb * lerp(1, matcap, matcap_mask) * _Rim_Lighting1_Emission; albedo.rgb *= lerp(1, matcap, matcap_mask); break; case 2: - albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask);; + albedo.rgb = lerp(albedo.rgb, matcap, matcap_mask); + matcap_emission = lerp(albedo.rgb, matcap, matcap_mask) * _Rim_Lighting1_Emission; break; case 3: albedo.rgb -= lerp(0, matcap, matcap_mask); + matcap_emission -= lerp(0, matcap, matcap_mask) * _Rim_Lighting1_Emission; break; case 4: albedo.rgb = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, min(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting1_Emission; break; case 5: albedo.rgb = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask); + matcap_emission = lerp(albedo.rgb, max(albedo.rgb, matcap), matcap_mask) * _Rim_Lighting1_Emission; break; default: break; @@ -672,6 +719,9 @@ float4 effect(inout v2f i) metallic, 1.0 - roughness, i.uv, i); float4 result = lit; +#if defined(_MATCAP0) || defined(_MATCAP1) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) + result.rgb += matcap_emission; +#endif #if defined(_LTCGI) if ((bool) round(_LTCGI_Enabled)) { ltcgi_acc acc = (ltcgi_acc) 0; |
