From 41dd4d9cdc5c20ad448df5d575d4b87f3b3e80b8 Mon Sep 17 00:00:00 2001 From: yum Date: Thu, 30 May 2024 01:17:44 -0700 Subject: Add overlay emission Also start fixing LOD logic for tiling textures --- Editor/tooner.cs | 11 +++++++++++ globals.cginc | 12 ++++++++++++ tooner.shader | 20 ++++++++++++++++++++ tooner_lighting.cginc | 30 ++++++++++++++++++++++++++---- 4 files changed, 69 insertions(+), 4 deletions(-) diff --git a/Editor/tooner.cs b/Editor/tooner.cs index 1da2bb9..602620b 100644 --- a/Editor/tooner.cs +++ b/Editor/tooner.cs @@ -146,6 +146,17 @@ public class ToonerGUI : ShaderGUI { SetKeyword($"_PBR_OVERLAY{i}_MIX_MIN", mode == PbrAlbedoMixMode.Min); SetKeyword($"_PBR_OVERLAY{i}_MIX_MAX", mode == PbrAlbedoMixMode.Max); + bc = FindProperty($"_PBR_Overlay{i}_Emission"); + bct = FindProperty($"_PBR_Overlay{i}_EmissionTex"); + editor.TexturePropertySingleLine( + MakeLabel(bct, "Emission (RGB)"), + bct, + bc); + if (bct.textureValue) { + editor.TextureScaleOffsetProperty(bct); + } + SetKeyword($"_PBR_OVERLAY{i}_EMISSION_MAP", bct.textureValue); + bct = FindProperty($"_PBR_Overlay{i}_NormalTex"); editor.TexturePropertySingleLine( MakeLabel(bct, "Normal"), diff --git a/globals.cginc b/globals.cginc index 9b6534a..6c3d51f 100644 --- a/globals.cginc +++ b/globals.cginc @@ -38,6 +38,9 @@ float _PBR_Overlay0_Metallic; float _PBR_Overlay0_Roughness; texture2D _PBR_Overlay0_BaseColorTex; float4 _PBR_Overlay0_BaseColorTex_ST; +float4 _PBR_Overlay0_Emission; +texture2D _PBR_Overlay0_EmissionTex; +float4 _PBR_Overlay0_EmissionTex_ST; texture2D _PBR_Overlay0_NormalTex; float4 _PBR_Overlay0_NormalTex_ST; texture2D _PBR_Overlay0_MetallicTex; @@ -55,6 +58,9 @@ float _PBR_Overlay1_Metallic; float _PBR_Overlay1_Roughness; texture2D _PBR_Overlay1_BaseColorTex; float4 _PBR_Overlay1_BaseColorTex_ST; +float4 _PBR_Overlay1_Emission; +texture2D _PBR_Overlay1_EmissionTex; +float4 _PBR_Overlay1_EmissionTex_ST; texture2D _PBR_Overlay1_NormalTex; float4 _PBR_Overlay1_NormalTex_ST; texture2D _PBR_Overlay1_MetallicTex; @@ -72,6 +78,9 @@ float _PBR_Overlay2_Metallic; float _PBR_Overlay2_Roughness; texture2D _PBR_Overlay2_BaseColorTex; float4 _PBR_Overlay2_BaseColorTex_ST; +float4 _PBR_Overlay2_Emission; +texture2D _PBR_Overlay2_EmissionTex; +float4 _PBR_Overlay2_EmissionTex_ST; texture2D _PBR_Overlay2_NormalTex; float4 _PBR_Overlay2_NormalTex_ST; texture2D _PBR_Overlay2_MetallicTex; @@ -89,6 +98,9 @@ float _PBR_Overlay3_Metallic; float _PBR_Overlay3_Roughness; texture2D _PBR_Overlay3_BaseColorTex; float4 _PBR_Overlay3_BaseColorTex_ST; +float4 _PBR_Overlay3_Emission; +texture2D _PBR_Overlay3_EmissionTex; +float4 _PBR_Overlay3_EmissionTex_ST; texture2D _PBR_Overlay3_NormalTex; float4 _PBR_Overlay3_NormalTex_ST; texture2D _PBR_Overlay3_MetallicTex; diff --git a/tooner.shader b/tooner.shader index 4c29975..fa0dce9 100644 --- a/tooner.shader +++ b/tooner.shader @@ -16,6 +16,8 @@ Shader "yum_food/tooner" _PBR_Overlay0_Metallic("Metallic", Range(0, 1)) = 0 _PBR_Overlay0_Roughness("Roughness", Range(0, 1)) = 1 _PBR_Overlay0_BaseColorTex("Base color", 2D) = "white" {} + _PBR_Overlay0_Emission("Emission", Color) = (1, 1, 1, 1) + _PBR_Overlay0_EmissionTex("Emission", 2D) = "black" {} _PBR_Overlay0_NormalTex("Normal", 2D) = "bump" {} _PBR_Overlay0_MetallicTex("Metallic", 2D) = "white" {} _PBR_Overlay0_RoughnessTex("Roughness", 2D) = "black" {} @@ -29,6 +31,8 @@ Shader "yum_food/tooner" _PBR_Overlay1_Metallic("Metallic", Range(0, 1)) = 0 _PBR_Overlay1_Roughness("Roughness", Range(0, 1)) = 1 _PBR_Overlay1_BaseColorTex("Base color", 2D) = "white" {} + _PBR_Overlay1_Emission("Emission", Color) = (1, 1, 1, 1) + _PBR_Overlay1_EmissionTex("Emission", 2D) = "black" {} _PBR_Overlay1_NormalTex("Normal", 2D) = "bump" {} _PBR_Overlay1_MetallicTex("Metallic", 2D) = "white" {} _PBR_Overlay1_RoughnessTex("Roughness", 2D) = "black" {} @@ -42,6 +46,8 @@ Shader "yum_food/tooner" _PBR_Overlay2_Metallic("Metallic", Range(0, 1)) = 0 _PBR_Overlay2_Roughness("Roughness", Range(0, 1)) = 1 _PBR_Overlay2_BaseColorTex("Base color", 2D) = "white" {} + _PBR_Overlay2_Emission("Emission", Color) = (1, 1, 1, 1) + _PBR_Overlay2_EmissionTex("Emission", 2D) = "black" {} _PBR_Overlay2_NormalTex("Normal", 2D) = "bump" {} _PBR_Overlay2_MetallicTex("Metallic", 2D) = "white" {} _PBR_Overlay2_RoughnessTex("Roughness", 2D) = "black" {} @@ -55,6 +61,8 @@ Shader "yum_food/tooner" _PBR_Overlay3_Metallic("Metallic", Range(0, 1)) = 0 _PBR_Overlay3_Roughness("Roughness", Range(0, 1)) = 1 _PBR_Overlay3_BaseColorTex("Base color", 2D) = "white" {} + _PBR_Overlay3_Emission("Emission", Color) = (1, 1, 1, 1) + _PBR_Overlay3_EmissionTex("Emission", 2D) = "black" {} _PBR_Overlay3_NormalTex("Normal", 2D) = "bump" {} _PBR_Overlay3_MetallicTex("Metallic", 2D) = "white" {} _PBR_Overlay3_RoughnessTex("Roughness", 2D) = "black" {} @@ -236,6 +244,7 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _CLONES #pragma shader_feature_local _ _PBR_OVERLAY0 #pragma shader_feature_local _ _PBR_OVERLAY0_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY0_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_METALLIC_MAP @@ -246,6 +255,7 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _PBR_OVERLAY0_MIX_MAX #pragma shader_feature_local _ _PBR_OVERLAY1 #pragma shader_feature_local _ _PBR_OVERLAY1_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY1_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_METALLIC_MAP @@ -256,6 +266,7 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _PBR_OVERLAY1_MIX_MAX #pragma shader_feature_local _ _PBR_OVERLAY2 #pragma shader_feature_local _ _PBR_OVERLAY2_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY2_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_METALLIC_MAP @@ -266,6 +277,7 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _PBR_OVERLAY2_MIX_MAX #pragma shader_feature_local _ _PBR_OVERLAY3 #pragma shader_feature_local _ _PBR_OVERLAY3_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY3_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_METALLIC_MAP @@ -337,24 +349,28 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _CLONES #pragma shader_feature_local _ _PBR_OVERLAY0 #pragma shader_feature_local _ _PBR_OVERLAY0_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY0_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_MASK #pragma shader_feature_local _ _PBR_OVERLAY1 #pragma shader_feature_local _ _PBR_OVERLAY1_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY1_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_MASK #pragma shader_feature_local _ _PBR_OVERLAY2 #pragma shader_feature_local _ _PBR_OVERLAY2_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY2_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_MASK #pragma shader_feature_local _ _PBR_OVERLAY3 #pragma shader_feature_local _ _PBR_OVERLAY3_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY3_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_METALLIC_MAP @@ -403,24 +419,28 @@ Shader "yum_food/tooner" #pragma shader_feature_local _ _CLONES #pragma shader_feature_local _ _PBR_OVERLAY0 #pragma shader_feature_local _ _PBR_OVERLAY0_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY0_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY0_MASK #pragma shader_feature_local _ _PBR_OVERLAY1 #pragma shader_feature_local _ _PBR_OVERLAY1_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY1_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY1_MASK #pragma shader_feature_local _ _PBR_OVERLAY2 #pragma shader_feature_local _ _PBR_OVERLAY2_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY2_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_METALLIC_MAP #pragma shader_feature_local _ _PBR_OVERLAY2_MASK #pragma shader_feature_local _ _PBR_OVERLAY3 #pragma shader_feature_local _ _PBR_OVERLAY3_BASECOLOR_MAP + #pragma shader_feature_local _ _PBR_OVERLAY3_EMISSION_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_NORMAL_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_ROUGHNESS_MAP #pragma shader_feature_local _ _PBR_OVERLAY3_METALLIC_MAP diff --git a/tooner_lighting.cginc b/tooner_lighting.cginc index 7f7ceb8..f4ec9eb 100644 --- a/tooner_lighting.cginc +++ b/tooner_lighting.cginc @@ -419,7 +419,7 @@ void getOverlayAlbedo(inout PbrOverlay ov, { #if defined(_PBR_OVERLAY0) #if defined(_PBR_OVERLAY0_BASECOLOR_MAP) - ov.ov0_albedo = _PBR_Overlay0_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay0_BaseColorTex_ST), iddx, iddy); + ov.ov0_albedo = _PBR_Overlay0_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay0_BaseColorTex_ST), iddx * _PBR_Overlay0_BaseColorTex_ST.x, iddy * _PBR_Overlay0_BaseColorTex_ST.y); ov.ov0_albedo *= _PBR_Overlay0_BaseColor; #else ov.ov0_albedo = _PBR_Overlay0_BaseColor; @@ -436,7 +436,7 @@ void getOverlayAlbedo(inout PbrOverlay ov, #if defined(_PBR_OVERLAY1) #if defined(_PBR_OVERLAY1_BASECOLOR_MAP) - ov.ov1_albedo = _PBR_Overlay1_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay1_BaseColorTex_ST), iddx, iddy); + ov.ov1_albedo = _PBR_Overlay1_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay1_BaseColorTex_ST), iddx * _PBR_Overlay1_BaseColorTex_ST.x, iddy * _PBR_Overlay1_BaseColorTex_ST.y); ov.ov1_albedo *= _PBR_Overlay1_BaseColor; #else ov.ov1_albedo = _PBR_Overlay1_BaseColor; @@ -453,7 +453,7 @@ void getOverlayAlbedo(inout PbrOverlay ov, #if defined(_PBR_OVERLAY2) #if defined(_PBR_OVERLAY2_BASECOLOR_MAP) - ov.ov2_albedo = _PBR_Overlay2_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay2_BaseColorTex_ST), iddx, iddy); + ov.ov2_albedo = _PBR_Overlay2_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay2_BaseColorTex_ST), iddx * _PBR_Overlay2_BaseColorTex_ST.x, iddy * _PBR_Overlay2_BaseColorTex_ST.y); ov.ov2_albedo *= _PBR_Overlay2_BaseColor; #else ov.ov2_albedo = _PBR_Overlay2_BaseColor; @@ -470,7 +470,7 @@ void getOverlayAlbedo(inout PbrOverlay ov, #if defined(_PBR_OVERLAY3) #if defined(_PBR_OVERLAY3_BASECOLOR_MAP) - ov.ov3_albedo = _PBR_Overlay3_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay3_BaseColorTex_ST), iddx, iddy); + ov.ov3_albedo = _PBR_Overlay3_BaseColorTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay3_BaseColorTex_ST), iddx * _PBR_Overlay3_BaseColorTex_ST.x, iddy * _PBR_Overlay3_BaseColorTex_ST.y); ov.ov3_albedo *= _PBR_Overlay3_BaseColor; #else ov.ov3_albedo = _PBR_Overlay3_BaseColor; @@ -572,6 +572,27 @@ void applyOverlayNormal(inout float3 raw_normal, PbrOverlay ov, v2f i, float idd #endif // _PBR_OVERLAY3 && _PBR_OVERLAY3_NORMAL_MAP } +float3 getOverlayEmission(PbrOverlay ov, v2f i, float iddx, float iddy) +{ + float3 em = 0; +#if defined(_PBR_OVERLAY0_EMISSION_MAP) + em += _PBR_Overlay0_EmissionTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay0_EmissionTex_ST), iddx * _PBR_Overlay0_EmissionTex_ST.x, iddy * _PBR_Overlay0_EmissionTex_ST.y) * _PBR_Overlay0_Emission * ov.ov0_mask; +#endif + +#if defined(_PBR_OVERLAY1_EMISSION_MAP) + em += _PBR_Overlay1_EmissionTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay1_EmissionTex_ST), iddx * _PBR_Overlay1_EmissionTex_ST.x, iddy * _PBR_Overlay1_EmissionTex_ST.y) * _PBR_Overlay1_Emission * ov.ov1_mask; +#endif + +#if defined(_PBR_OVERLAY2_EMISSION_MAP) + em += _PBR_Overlay2_EmissionTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay2_EmissionTex_ST), iddx * _PBR_Overlay2_EmissionTex_ST.x, iddy * _PBR_Overlay2_EmissionTex_ST.y) * _PBR_Overlay2_Emission * ov.ov2_mask; +#endif + +#if defined(_PBR_OVERLAY3_EMISSION_MAP) + em += _PBR_Overlay3_EmissionTex.SampleGrad(linear_repeat_s, UV_SCOFF(i.uv, _PBR_Overlay3_EmissionTex_ST), iddx * _PBR_Overlay3_EmissionTex_ST.x, iddy * _PBR_Overlay3_EmissionTex_ST.y) * _PBR_Overlay3_Emission * ov.ov3_mask; +#endif + return em; +} + float4 effect(inout v2f i) { float iddx = ddx(i.uv.x) * _Mip_Multiplier; @@ -930,6 +951,7 @@ float4 effect(inout v2f i) #if defined(_RENDERING_TRANSPARENT) || defined(_RENDERING_TRANSCLIPPING) result.rgb *= result.a; #endif + result.rgb += getOverlayEmission(ov, i, iddx, iddy); return result; } -- cgit v1.2.3