summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-05-22 13:45:14 -0700
committeryum <yum.food.vr@gmail.com>2024-05-22 13:45:14 -0700
commitcb54d0f9ad63f8937e7834e8e871999447f6e523 (patch)
treed8d63001e4db2f1b0057b46432149f7f937adb4b
parenta942266a189d2c7b985f812536bb7b654121848a (diff)
Add matcap/rim lighting emissions, matcap distortion
-rw-r--r--Editor/tooner.cs23
-rw-r--r--globals.cginc4
-rw-r--r--tooner.shader16
-rw-r--r--tooner_lighting.cginc58
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;