From 5b2eb1714818cd9f26089e76c094464ddb4fbc61 Mon Sep 17 00:00:00 2001 From: Misaki Date: Thu, 22 May 2025 22:28:48 +0900 Subject: [PATCH] Added translaprent support --- Editor/MeterialEditor/Deprecated/UTS3GUI.cs | 24 ++-- .../MeterialEditor/Helpers/MaterialHelpers.cs | 4 +- .../MeterialEditor/UIScopes/AdvanceScope.cs | 4 +- .../MeterialEditor/UIScopes/AngelRingScope.cs | 2 +- .../MeterialEditor/UIScopes/OutlineScope.cs | 12 +- .../MeterialEditor/UIScopes/RimLightScope.cs | 2 +- .../UIScopes/SurfaceInputsScope.cs | 2 +- .../UIScopes/SurfaceOptionsScope.cs | 75 +++++----- Editor/MeterialEditor/UTSShaderGUI.cs | 2 +- .../{UtsShaderPassName.cs => UTSPassName.cs} | 2 +- Runtime/Constants/UTSPassName.cs.meta | 2 + ...aderPropertyName.cs => UTSPropertyName.cs} | 37 ++++- Runtime/Constants/UTSPropertyName.cs.meta | 2 + Runtime/Constants/UtsShaderPassName.cs.meta | 2 - .../Constants/UtsShaderPropertyName.cs.meta | 2 - Runtime/Models/ShaderEnum.cs | 15 +- Runtime/Models/UTSRenderPassSettings.cs | 2 + Runtime/Shaders/HDRPToon.shader | 136 ++++++++++-------- .../Shaders/Includes/Common/UtsLitData.hlsl | 1 - .../Includes/Lighting/UtsLightEvaluation.hlsl | 1 + .../Lighting/UtsMaterialEvaluation.hlsl | 8 +- .../Properties/UtsUnityPerMaterial.hlsl | 2 + .../Includes/ShaderPass/HDRPToonOutline.hlsl | 47 +++--- .../ShaderPass/UtsShaderPassForward.hlsl | 26 ++-- Runtime/UTS Renderer/UTSOutlinePass.cs | 4 +- Runtime/UTS Renderer/UTSPass.cs | 17 +-- .../UTS Renderer/UTSRenderPassRegistrar.cs | 4 +- Runtime/UTSAPI.cs | 134 ++++++++++++----- 28 files changed, 357 insertions(+), 214 deletions(-) rename Runtime/Constants/{UtsShaderPassName.cs => UTSPassName.cs} (93%) create mode 100644 Runtime/Constants/UTSPassName.cs.meta rename Runtime/Constants/{UtsShaderPropertyName.cs => UTSPropertyName.cs} (70%) create mode 100644 Runtime/Constants/UTSPropertyName.cs.meta delete mode 100644 Runtime/Constants/UtsShaderPassName.cs.meta delete mode 100644 Runtime/Constants/UtsShaderPropertyName.cs.meta diff --git a/Editor/MeterialEditor/Deprecated/UTS3GUI.cs b/Editor/MeterialEditor/Deprecated/UTS3GUI.cs index 5a132ab..5d9b65a 100644 --- a/Editor/MeterialEditor/Deprecated/UTS3GUI.cs +++ b/Editor/MeterialEditor/Deprecated/UTS3GUI.cs @@ -1649,11 +1649,11 @@ namespace UnityEditor.Rendering.Toon m_MaterialEditor.TexturePropertySingleLine(Styles.hairBlendingTargetMapText, hairBlendingMap); EditorGUI.indentLevel--; } - material.SetShaderPassEnabled(UtsShaderPassName.HAIR_BLENDING_TARGET_PASS_NAME, isHairBlendingTargetEnabled); + material.SetShaderPassEnabled(UTSPassName.HAIR_BLENDING_TARGET_PASS_NAME, isHairBlendingTargetEnabled); SwitchKeyword(m_materialType); material.SetFloat(ShaderPropMaterialType, (float)m_materialType); - material.SetShaderPassEnabled(UtsShaderPassName.HAIR_SHADOW_CASTER_PASS_NAME, m_materialType == MaterialType.FrontHair); + material.SetShaderPassEnabled(UTSPassName.HAIR_SHADOW_CASTER_PASS_NAME, m_materialType == MaterialType.FrontHair); void SwitchKeyword(MaterialType target) { @@ -2347,18 +2347,18 @@ namespace UnityEditor.Rendering.Toon internal static void SetupOverDrawTransparentObject(Material material) { - var srpDefaultLightModeTag = material.GetTag("LightMode", false, UtsShaderPassName.OUTLINE_PASS_NAME); - if (srpDefaultLightModeTag == UtsShaderPassName.OUTLINE_PASS_NAME) + var srpDefaultLightModeTag = material.GetTag("LightMode", false, UTSPassName.OUTLINE_PASS_NAME); + if (srpDefaultLightModeTag == UTSPassName.OUTLINE_PASS_NAME) { - material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, true); + material.SetShaderPassEnabled(UTSPassName.OUTLINE_PASS_NAME, true); MaterialSetInt(material, srpDefaultColorMask, 0); MaterialSetInt(material, srpDefaultCullMode, (int)CullingMode.Backface); } } internal static void SetupOutline(Material material) { - var srpDefaultLightModeTag = material.GetTag("LightMode", false, UtsShaderPassName.OUTLINE_PASS_NAME); - if (srpDefaultLightModeTag == UtsShaderPassName.OUTLINE_PASS_NAME) + var srpDefaultLightModeTag = material.GetTag("LightMode", false, UTSPassName.OUTLINE_PASS_NAME); + if (srpDefaultLightModeTag == UTSPassName.OUTLINE_PASS_NAME) { MaterialSetInt(material, srpDefaultColorMask, 15); MaterialSetInt(material, srpDefaultCullMode, (int)CullingMode.Frontface); @@ -2368,12 +2368,12 @@ namespace UnityEditor.Rendering.Toon { EditorGUILayout.HelpBox("You need to add OutlinePass in custom pass to make outline work properly", MessageType.Warning); - var srpDefaultLightModeTag = material.GetTag("LightMode", false, UtsShaderPassName.OUTLINE_PASS_NAME); + var srpDefaultLightModeTag = material.GetTag("LightMode", false, UTSPassName.OUTLINE_PASS_NAME); var isOutlineEnabled = true; - if (srpDefaultLightModeTag == UtsShaderPassName.OUTLINE_PASS_NAME) + if (srpDefaultLightModeTag == UTSPassName.OUTLINE_PASS_NAME) { const string kOutline = "Outline"; - isOutlineEnabled = material.GetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME); + isOutlineEnabled = material.GetShaderPassEnabled(UTSPassName.OUTLINE_PASS_NAME); EditorGUI.BeginChangeCheck(); isOutlineEnabled = EditorGUILayout.Toggle(kOutline, isOutlineEnabled); @@ -2382,11 +2382,11 @@ namespace UnityEditor.Rendering.Toon m_MaterialEditor.RegisterPropertyChangeUndo(kOutline); if (isOutlineEnabled) { - material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, true); + material.SetShaderPassEnabled(UTSPassName.OUTLINE_PASS_NAME, true); } else { - material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, false); + material.SetShaderPassEnabled(UTSPassName.OUTLINE_PASS_NAME, false); } } } diff --git a/Editor/MeterialEditor/Helpers/MaterialHelpers.cs b/Editor/MeterialEditor/Helpers/MaterialHelpers.cs index 0b4c254..71dbb3e 100644 --- a/Editor/MeterialEditor/Helpers/MaterialHelpers.cs +++ b/Editor/MeterialEditor/Helpers/MaterialHelpers.cs @@ -1,6 +1,6 @@ using UnityEngine; -using static Misaki.HdrpToon.UtsShaderPropertyName; +using static Misaki.HdrpToon.UTSPropertyName; namespace Misaki.HdrpToon.Editor { @@ -49,7 +49,7 @@ namespace Misaki.HdrpToon.Editor public static bool IsHairBlendingTarget(this Material material) { - return material.GetShaderPassEnabled(UtsShaderPassName.HAIR_BLENDING_TARGET_PASS_NAME); + return material.GetShaderPassEnabled(UTSPassName.HAIR_BLENDING_TARGET_PASS_NAME); } } } \ No newline at end of file diff --git a/Editor/MeterialEditor/UIScopes/AdvanceScope.cs b/Editor/MeterialEditor/UIScopes/AdvanceScope.cs index 061e74e..8cf0c1a 100644 --- a/Editor/MeterialEditor/UIScopes/AdvanceScope.cs +++ b/Editor/MeterialEditor/UIScopes/AdvanceScope.cs @@ -2,7 +2,7 @@ using Misaki.ShaderGUI; using UnityEditor; using UnityEngine; -using static Misaki.HdrpToon.UtsShaderPropertyName.Advance; +using static Misaki.HdrpToon.UTSPropertyName.Advance; namespace Misaki.HdrpToon.Editor { @@ -20,7 +20,7 @@ namespace Misaki.HdrpToon.Editor private static class Styles { - public static readonly GUIContent diffuseMinText = new("Minimal diffuse contribution", "Specifies the minimum contribution of the base color to the diffuse light. Keep it 0 to make sure energy conservation."); + public static readonly GUIContent diffuseMinText = new("Minimal Diffuse Contribution", "Specifies the minimum contribution of the base color to the diffuse light. Keep it 0 to make sure energy conservation."); public static readonly GUIContent lightIntensityMultiplierText = new("Light Intensity Multiplier", "Specifies the intensity multiplier of the light."); public static readonly GUIContent clampLightColorText = new("Clamp Light Color", "Specifies whether to clamp the light color."); diff --git a/Editor/MeterialEditor/UIScopes/AngelRingScope.cs b/Editor/MeterialEditor/UIScopes/AngelRingScope.cs index 1691a43..9499f63 100644 --- a/Editor/MeterialEditor/UIScopes/AngelRingScope.cs +++ b/Editor/MeterialEditor/UIScopes/AngelRingScope.cs @@ -3,7 +3,7 @@ using System.Linq; using UnityEditor; using UnityEngine; -using static Misaki.HdrpToon.UtsShaderPropertyName.AngelRing; +using static Misaki.HdrpToon.UTSPropertyName.AngelRing; namespace Misaki.HdrpToon.Editor { diff --git a/Editor/MeterialEditor/UIScopes/OutlineScope.cs b/Editor/MeterialEditor/UIScopes/OutlineScope.cs index 6e435e5..83585b2 100644 --- a/Editor/MeterialEditor/UIScopes/OutlineScope.cs +++ b/Editor/MeterialEditor/UIScopes/OutlineScope.cs @@ -1,8 +1,10 @@ using Misaki.ShaderGUI; +using System.Linq; using UnityEditor; using UnityEngine; -using static Misaki.HdrpToon.UtsShaderPropertyName.Outline; +using static Misaki.HdrpToon.UTSPropertyName.Outline; +using static UnityEditor.EditorGUI; namespace Misaki.HdrpToon.Editor { @@ -71,6 +73,14 @@ namespace Misaki.HdrpToon.Editor if (Properties.outlineState.GetBooleanValue()) { + var isTransparentAny = materials.Any(m => m.GetInteger(UTSPropertyName.SurfaceOptions.SURFACE_TYPE) == 1); + if (isTransparentAny) + { + EditorGUILayout.HelpBox("Outline is not supported in transparent mode.", MessageType.Warning); + } + + using var settingScope = new DisabledGroupScope(isTransparentAny); + EditorGUILayout.Space(); editor.TexturePropertySingleLine(Styles.outlineWidthText, Properties.outlineWidthMap, Properties.outlineWidth); editor.TexturePropertySingleLine(Styles.outlineColorText, Properties.outlineColorMap, Properties.outlineColor); diff --git a/Editor/MeterialEditor/UIScopes/RimLightScope.cs b/Editor/MeterialEditor/UIScopes/RimLightScope.cs index 523ad13..e985ecd 100644 --- a/Editor/MeterialEditor/UIScopes/RimLightScope.cs +++ b/Editor/MeterialEditor/UIScopes/RimLightScope.cs @@ -3,7 +3,7 @@ using System.Linq; using UnityEditor; using UnityEngine; -using static Misaki.HdrpToon.UtsShaderPropertyName.RimLight; +using static Misaki.HdrpToon.UTSPropertyName.RimLight; namespace Misaki.HdrpToon.Editor { diff --git a/Editor/MeterialEditor/UIScopes/SurfaceInputsScope.cs b/Editor/MeterialEditor/UIScopes/SurfaceInputsScope.cs index f0c820e..6edaff3 100644 --- a/Editor/MeterialEditor/UIScopes/SurfaceInputsScope.cs +++ b/Editor/MeterialEditor/UIScopes/SurfaceInputsScope.cs @@ -4,7 +4,7 @@ using UnityEditor; using UnityEditor.Rendering; using UnityEngine; -using static Misaki.HdrpToon.UtsShaderPropertyName.SurfaceInputs; +using static Misaki.HdrpToon.UTSPropertyName.SurfaceInputs; namespace Misaki.HdrpToon.Editor { diff --git a/Editor/MeterialEditor/UIScopes/SurfaceOptionsScope.cs b/Editor/MeterialEditor/UIScopes/SurfaceOptionsScope.cs index 94c551c..a80b8d1 100644 --- a/Editor/MeterialEditor/UIScopes/SurfaceOptionsScope.cs +++ b/Editor/MeterialEditor/UIScopes/SurfaceOptionsScope.cs @@ -2,18 +2,22 @@ using Misaki.ShaderGUI; using UnityEditor; using UnityEngine; +using static Misaki.HdrpToon.UTSPropertyName.SurfaceOptions; + namespace Misaki.HdrpToon.Editor { internal class SurfaceOptionsScope : MaterialUIScope { private static class Properties { - public static MaterialProperty transparentMode; + public static MaterialProperty surfaceType; + public static MaterialProperty fogOnTransparent; public static MaterialProperty alphaClipEnable; public static MaterialProperty alphaClip; - public static MaterialProperty cullMode; + public static MaterialProperty doubleSidedNormalMode; + public static MaterialProperty shadingMode; public static MaterialProperty materialType; public static MaterialProperty pbrMode; @@ -24,12 +28,14 @@ namespace Misaki.HdrpToon.Editor private static class Styles { - public static readonly GUIContent transparentModeText = new("Transparent Mode", "Enable different modes that allow the simulation of a variety of transparent objects."); + public static readonly GUIContent transparentModeText = new("Surface Type", "Controls the surface type of the material."); + public static readonly GUIContent fogOnTransparentText = new("Fog On Transparent", "Enable to apply fog effect on transparent objects."); public static readonly GUIContent alphaClipEnableText = new("Alpha Clipping", "Enable alpha clipping."); public static readonly GUIContent alphaClipText = new("Alpha Clipping Threshold", "Threshold for alpha clipping."); - public static readonly GUIContent cullingModeText = new("Culling Mode", "Controls the sides of polygons that should not be drawn (culled)."); + public static readonly GUIContent doubleSidedNormalModeText = new("Double Sided Mode", "Controls the normal mode for double-sided rendering."); + public static readonly GUIContent shadingModeText = new("Shading Color Mode", "Specifies the shading grade mode."); public static readonly GUIContent materialTypeText = new("Material Type", "Specifies the material type."); public static readonly GUIContent pbrModeText = new("PBR Mode", "Specifies PBR model mode."); @@ -44,56 +50,53 @@ namespace Misaki.HdrpToon.Editor public override void LoadMaterialProperties() { - Properties.transparentMode = FindProperty("_TransparentEnabled"); + Properties.surfaceType = FindProperty(SURFACE_TYPE); + Properties.fogOnTransparent = FindProperty(FOG_ON_TRANSPARENT); - Properties.alphaClipEnable = FindProperty("_AlphaCutoffEnable"); - Properties.alphaClip = FindProperty("_AlphaCutoff"); + Properties.alphaClipEnable = FindProperty(ALPHA_CLIP_ENABLE); + Properties.alphaClip = FindProperty(ALPHA_CUTOFF); + Properties.cullMode = FindProperty(CULL_MODE); + Properties.doubleSidedNormalMode = FindProperty(DOUBLE_SIDED_NORMAL_MODE); - Properties.cullMode = FindProperty("_CullMode"); - Properties.shadingMode = FindProperty("_Shading_Mode"); - Properties.materialType = FindProperty("_Material_Type"); - Properties.pbrMode = FindProperty("_PBR_Mode"); + Properties.shadingMode = FindProperty(SHADING_MODE); + Properties.materialType = FindProperty(MATERIAL_TYPE); + Properties.pbrMode = FindProperty(PBR_MODE); - Properties.hairBlendingTarget = FindProperty("_HairBlendingTarget"); - Properties.surfaceFeatures = FindProperty("_SurfaceFeatures"); + Properties.hairBlendingTarget = FindProperty(HAIR_BLENDING_TARGET); + Properties.surfaceFeatures = FindProperty(SURFACE_FEATURE); } protected override void DrawContent() { - editor.ShaderProperty(Properties.transparentMode, Styles.transparentModeText); + editor.ShaderProperty(Properties.surfaceType, Styles.transparentModeText); + using (new EditorGUI.IndentLevelScope()) + { + if (Properties.surfaceType.GetBooleanValue()) + { + editor.ShaderProperty(Properties.fogOnTransparent, Styles.fogOnTransparentText); + } + + editor.ShaderProperty(Properties.cullMode, Styles.cullingModeText); + if (Properties.cullMode.intValue == 0) + { + using (new EditorGUI.IndentLevelScope()) + { + editor.ShaderProperty(Properties.doubleSidedNormalMode, Styles.doubleSidedNormalModeText); + } + } + } editor.ShaderProperty(Properties.alphaClipEnable, Styles.alphaClipEnableText); if (Properties.alphaClipEnable.GetBooleanValue()) { - EditorGUI.indentLevel++; + using var s = new EditorGUI.IndentLevelScope(); editor.ShaderProperty(Properties.alphaClip, Styles.alphaClipText); - EditorGUI.indentLevel--; } - editor.ShaderProperty(Properties.cullMode, Styles.cullingModeText); editor.ShaderProperty(Properties.shadingMode, Styles.shadingModeText); - EditorGUI.BeginChangeCheck(); editor.ShaderProperty(Properties.materialType, Styles.materialTypeText); - if (EditorGUI.EndChangeCheck()) - { - foreach (var material in materials) - { - material.SetShaderPassEnabled(UtsShaderPassName.HAIR_SHADOW_CASTER_PASS_NAME, Properties.materialType.GetEnumValue() == MaterialType.FrontHair); - } - } - editor.ShaderProperty(Properties.pbrMode, Styles.pbrModeText); - - EditorGUI.BeginChangeCheck(); editor.ShaderProperty(Properties.hairBlendingTarget, Styles.hairBlendingTargetText); - if (EditorGUI.EndChangeCheck()) - { - foreach (var material in materials) - { - material.SetShaderPassEnabled(UtsShaderPassName.HAIR_BLENDING_TARGET_PASS_NAME, Properties.hairBlendingTarget.GetBooleanValue()); - } - } - editor.ShaderProperty(Properties.surfaceFeatures, Styles.surfaceFeaturesText); } } diff --git a/Editor/MeterialEditor/UTSShaderGUI.cs b/Editor/MeterialEditor/UTSShaderGUI.cs index 82c6cd7..6ba01ff 100644 --- a/Editor/MeterialEditor/UTSShaderGUI.cs +++ b/Editor/MeterialEditor/UTSShaderGUI.cs @@ -11,8 +11,8 @@ namespace Misaki.HdrpToon.Editor public override void ValidateMaterial(Material material) { UTSAPI.SetupPass(material); - UTSAPI.SetupProperties(material); UTSAPI.SetupKeywords(material); + UTSAPI.SetupProperties(material); } public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) diff --git a/Runtime/Constants/UtsShaderPassName.cs b/Runtime/Constants/UTSPassName.cs similarity index 93% rename from Runtime/Constants/UtsShaderPassName.cs rename to Runtime/Constants/UTSPassName.cs index 16e9c10..d1a01cf 100644 --- a/Runtime/Constants/UtsShaderPassName.cs +++ b/Runtime/Constants/UTSPassName.cs @@ -2,7 +2,7 @@ namespace Misaki.HdrpToon { - public static class UtsShaderPassName + public static class UTSPassName { public const string OUTLINE_PASS_NAME = "Outline"; public const string HAIR_SHADOW_CASTER_PASS_NAME = "HairShadowCaster"; diff --git a/Runtime/Constants/UTSPassName.cs.meta b/Runtime/Constants/UTSPassName.cs.meta new file mode 100644 index 0000000..03ed589 --- /dev/null +++ b/Runtime/Constants/UTSPassName.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9522e8a96ee83bb4c9bc6445747d6f45 \ No newline at end of file diff --git a/Runtime/Constants/UtsShaderPropertyName.cs b/Runtime/Constants/UTSPropertyName.cs similarity index 70% rename from Runtime/Constants/UtsShaderPropertyName.cs rename to Runtime/Constants/UTSPropertyName.cs index c0d96fc..036075c 100644 --- a/Runtime/Constants/UtsShaderPropertyName.cs +++ b/Runtime/Constants/UTSPropertyName.cs @@ -1,11 +1,44 @@ namespace Misaki.HdrpToon { - internal static class UtsShaderPropertyName + internal static class UTSPropertyName { + public static class InternalProperties + { + public const string SURFACE_TYPE = "_SurfaceType"; + public const string DOUBLE_SIDED_CONSTANTS = "_DoubleSidedConstants"; + + public const string TRANSPARENT_DEPTH_PREPASS_ENABLE = "_TransparentDepthPrepassEnable"; + public const string TRANSPARENT_BACKFACE_ENABLE = "_TransparentBackfaceEnable"; + public const string TRANSPARENT_DEPTH_POSTPASS_ENABLE = "_TransparentDepthPostpassEnable"; + + public const string TRANSPARENT_CULL_MODE = "_TransparentCullMode"; + public const string OPAQUE_CULL_MODE = "_OpaqueCullMode"; + + public const string SRC_BLEND = "_SrcBlend"; + public const string DEST_BLEND = "_DstBlend"; + public const string DEST_BLEND2 = "_DstBlend2"; + public const string ALPHA_SRC_BLEND = "_AlphaSrcBlend"; + public const string ALPHA_DEST_BLEND = "_AlphaDstBlend"; + + public const string CULL_MODE_FORWARD = "_CullModeForward"; + + public const string ZTEST_GBUFFER = "_ZTestGBuffer"; + public const string ZTEST_DEPTH_EQUAL_FOR_OPAQUE = "_ZTestDepthEqualForOpaque"; + public const string ZTEST_TRANSPARENT = "_ZTestTransparent"; + + public const string ZWRITE = "_ZWrite"; + } + public static class SurfaceOptions { - public const string TRANSPARENT_ENABLED = "_TransparentEnabled"; + public const string SURFACE_TYPE = "_SurfaceType"; + + public const string FOG_ON_TRANSPARENT = "_FogOnTransparent"; public const string ALPHA_CLIP_ENABLE = "_AlphaCutoffEnable"; + public const string ALPHA_CUTOFF = "_AlphaCutoff"; + public const string CULL_MODE = "_CullMode"; + public const string DOUBLE_SIDED_NORMAL_MODE = "_DoubleSidedNormalMode"; + public const string SHADING_MODE = "_Shading_Mode"; public const string MATERIAL_TYPE = "_Material_Type"; public const string PBR_MODE = "_PBR_Mode"; diff --git a/Runtime/Constants/UTSPropertyName.cs.meta b/Runtime/Constants/UTSPropertyName.cs.meta new file mode 100644 index 0000000..d4f2430 --- /dev/null +++ b/Runtime/Constants/UTSPropertyName.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 67328b7e131292649a97d548dd87f389 \ No newline at end of file diff --git a/Runtime/Constants/UtsShaderPassName.cs.meta b/Runtime/Constants/UtsShaderPassName.cs.meta deleted file mode 100644 index 6c2a64a..0000000 --- a/Runtime/Constants/UtsShaderPassName.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 8a2b199311606f54a9585b9b3ea31e7d \ No newline at end of file diff --git a/Runtime/Constants/UtsShaderPropertyName.cs.meta b/Runtime/Constants/UtsShaderPropertyName.cs.meta deleted file mode 100644 index 2623ca8..0000000 --- a/Runtime/Constants/UtsShaderPropertyName.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 723370b3a1613cb43b85b765ebcebee3 \ No newline at end of file diff --git a/Runtime/Models/ShaderEnum.cs b/Runtime/Models/ShaderEnum.cs index b72b4f1..76a2d9c 100644 --- a/Runtime/Models/ShaderEnum.cs +++ b/Runtime/Models/ShaderEnum.cs @@ -1,9 +1,22 @@ namespace Misaki.HdrpToon { + internal enum SurfaceType + { + Opaque, + Transparent + } + + internal enum DoubleSidedMode + { + None, + Mirror, + Flip + } + internal enum ShadingMode { Standard, - SDF, + SDF } internal enum MaterialType diff --git a/Runtime/Models/UTSRenderPassSettings.cs b/Runtime/Models/UTSRenderPassSettings.cs index 71cb1a7..2241cf8 100644 --- a/Runtime/Models/UTSRenderPassSettings.cs +++ b/Runtime/Models/UTSRenderPassSettings.cs @@ -79,9 +79,11 @@ namespace Misaki.HdrpToon #endif } +#if UNITY_EDITOR public static SerializedObject GetSerializedSettings() { return new(GetOrCreateSettings()); } +#endif } } \ No newline at end of file diff --git a/Runtime/Shaders/HDRPToon.shader b/Runtime/Shaders/HDRPToon.shader index 895b85f..0df51f0 100644 --- a/Runtime/Shaders/HDRPToon.shader +++ b/Runtime/Shaders/HDRPToon.shader @@ -3,63 +3,56 @@ Shader "HDRP/Toon" Properties { //TODO: Write HDRP properties to UTS properties - [ToggleUI] _UseShadowThreshold("_UseShadowThreshold", Float) = 0.0 + [ToggleUI] _UseShadowThreshold("_UseShadowThreshold", Integer) = 0 _AlphaCutoffShadow("_AlphaCutoffShadow", Range(0.0, 1.0)) = 0.5 _AlphaCutoffPrepass("_AlphaCutoffPrepass", Range(0.0, 1.0)) = 0.5 _AlphaCutoffPostpass("_AlphaCutoffPostpass", Range(0.0, 1.0)) = 0.5 - [ToggleUI] _TransparentDepthPrepassEnable("_TransparentDepthPrepassEnable", Float) = 0.0 - [ToggleUI] _TransparentBackfaceEnable("_TransparentBackfaceEnable", Float) = 0.0 - [ToggleUI] _TransparentDepthPostpassEnable("_TransparentDepthPostpassEnable", Float) = 0.0 - _TransparentSortPriority("_TransparentSortPriority", Float) = 0 + [ToggleUI] _TransparentDepthPrepassEnable("_TransparentDepthPrepassEnable", Integer) = 0 + [ToggleUI] _TransparentBackfaceEnable("_TransparentBackfaceEnable", Integer) = 0 + [ToggleUI] _TransparentDepthPostpassEnable("_TransparentDepthPostpassEnable", Integer) = 0 + _TransparentSortPriority("_TransparentSortPriority", Integer) = 0 // Transparency - [Enum(None, 0, Box, 1, Sphere, 2, Thin, 3)]_RefractionModel("Refraction Model", Int) = 0 - [Enum(Proxy, 1, HiZ, 2)]_SSRefractionProjectionModel("Refraction Projection Model", Int) = 1 + [Enum(None, 0, Box, 1, Sphere, 2, Thin, 3)]_RefractionModel("Refraction Model", Integer) = 0 + [Enum(Proxy, 1, HiZ, 2)]_SSRefractionProjectionModel("Refraction Projection Model", Integer) = 1 _Ior("Index Of Refraction", Range(1.0, 2.5)) = 1.0 _ThicknessMultiplier("Thickness Multiplier", Float) = 1.0 _TransmittanceColor("Transmittance Color", Color) = (1.0, 1.0, 1.0) _TransmittanceColorMap("TransmittanceColorMap", 2D) = "white" {} _ATDistance("Transmittance Absorption Distance", Float) = 1.0 - [ToggleUI] _TransparentWritingMotionVec("_TransparentWritingMotionVec", Float) = 0.0 + [ToggleUI] _TransparentWritingMotionVec("_TransparentWritingMotionVec", Integer) = 0 // Forward - [HideInInspector] _StencilRef("_StencilRef", Int) = 2 // StencilLightingUsage.RegularLighting - [HideInInspector] _StencilWriteMask("_StencilWriteMask", Int) = 3 // StencilMask.Lighting + [HideInInspector] _StencilRef("_StencilRef", Integer) = 0 // StencilUsage.Clear + [HideInInspector] _StencilWriteMask("_StencilWriteMask", Integer) = 3 // StencilUsage.RequiresDeferredLighting | StencilUsage.SubsurfaceScattering // GBuffer - [HideInInspector] _StencilRefGBuffer("_StencilRefGBuffer", Int) = 2 // StencilLightingUsage.RegularLighting - [HideInInspector] _StencilWriteMaskGBuffer("_StencilWriteMaskGBuffer", Int) = 3 // StencilMask.Lighting + [HideInInspector] _StencilRefGBuffer("_StencilRefGBuffer", Integer) = 2 // StencilUsage.RequiresDeferredLighting + [HideInInspector] _StencilWriteMaskGBuffer("_StencilWriteMaskGBuffer", Integer) = 3 // StencilUsage.RequiresDeferredLighting | StencilUsage.SubsurfaceScattering // Depth prepass - [HideInInspector] _StencilRefDepth("_StencilRefDepth", Int) = 0 // Nothing - [HideInInspector] _StencilWriteMaskDepth("_StencilWriteMaskDepth", Int) = 32 // DoesntReceiveSSR + [HideInInspector] _StencilRefDepth("_StencilRefDepth", Integer) = 0 // Nothing + [HideInInspector] _StencilWriteMaskDepth("_StencilWriteMaskDepth", Integer) = 8 // StencilUsage.TraceReflectionRay // Motion vector pass - [HideInInspector] _StencilRefMV("_StencilRefMV", Int) = 128 // StencilBitMask.ObjectMotionVectors - [HideInInspector] _StencilWriteMaskMV("_StencilWriteMaskMV", Int) = 128 // StencilBitMask.ObjectMotionVectors + [HideInInspector] _StencilRefMV("_StencilRefMV", Integer) = 32 // StencilBitMask.ObjectMotionVectors + [HideInInspector] _StencilWriteMaskMV("_StencilWriteMaskMV", Integer) = 32 // StencilBitMask.ObjectMotionVectors // Distortion vector pass - [HideInInspector] _StencilRefDistortionVec("_StencilRefDistortionVec", Int) = 64 // StencilBitMask.DistortionVectors - [HideInInspector] _StencilWriteMaskDistortionVec("_StencilWriteMaskDistortionVec", Int) = 64 // StencilBitMask.DistortionVectors + [HideInInspector] _StencilRefDistortionVec("_StencilRefDistortionVec", Integer) = 64 // StencilBitMask.DistortionVectors + [HideInInspector] _StencilWriteMaskDistortionVec("_StencilWriteMaskDistortionVec", Integer) = 64 // StencilBitMask.DistortionVectors // Blending state - [HideInInspector] _SurfaceType("__surfacetype", Float) = 0.0 - [HideInInspector] _BlendMode("__blendmode", Float) = 0.0 - [HideInInspector] _SrcBlend("__src", Float) = 1.0 - [HideInInspector] _DstBlend("__dst", Float) = 0.0 - [HideInInspector] _AlphaSrcBlend("__alphaSrc", Float) = 1.0 - [HideInInspector] _AlphaDstBlend("__alphaDst", Float) = 0.0 - [HideInInspector][ToggleUI] _ZWrite("__zw", Float) = 1.0 - [HideInInspector][ToggleUI] _TransparentZWrite("_TransparentZWrite", Float) = 0.0 - [HideInInspector] _CullModeForward("__cullmodeForward", Float) = 2.0 // This mode is dedicated to Forward to correctly handle backface then front face rendering thin transparent - [HideInInspector] _TransparentCullMode("_TransparentCullMode", Int) = 2 // Back culling by default - [HideInInspector] _ZTestDepthEqualForOpaque("_ZTestDepthEqualForOpaque", Int) = 4 // Less equal - [HideInInspector] _ZTestModeDistortion("_ZTestModeDistortion", Int) = 8 - [HideInInspector] _ZTestGBuffer("_ZTestGBuffer", Int) = 4 - [HideInInspector] _ZTestMode("_ZTestMode", Int) = 4 - [Enum(UnityEngine.Rendering.CompareFunction)] _ZTestTransparent("Transparent ZTest", Int) = 4 // Less equal + _BlendMode("__blendmode", Integer) = 0 + [HideInInspector] _SrcBlend("__src", Integer) = 1 + [HideInInspector] _DstBlend("__dst", Integer) = 0 + [HideInInspector] _AlphaSrcBlend("__alphaSrc", Integer) = 1 + [HideInInspector] _AlphaDstBlend("__alphaDst", Integer) = 0 + [HideInInspector][ToggleUI] _ZWrite("__zw", Integer) = 1 + [HideInInspector][ToggleUI] _TransparentZWrite("_TransparentZWrite", Integer) = 0 + [HideInInspector] _CullModeForward("__cullmodeForward", Integer) = 2.0 // This mode is dedicated to Forward to correctly handle backface then front face rendering thin transparent + [HideInInspector] _ZTestDepthEqualForOpaque("_ZTestDepthEqualForOpaque", Integer) = 4 // Less equal + [HideInInspector] _ZTestModeDistortion("_ZTestModeDistortion", Integer) = 8 + [HideInInspector] _ZTestGBuffer("_ZTestGBuffer", Integer) = 4 + [HideInInspector] _ZTestMode("_ZTestMode", Integer) = 4 + [Enum(UnityEngine.Rendering.CompareFunction)] _ZTestTransparent("Transparent ZTest", Integer) = 4 // Less equal - [ToggleUI] _EnableFogOnTransparent("Enable Fog", Float) = 1.0 - [ToggleUI] _EnableBlendModePreserveSpecularLighting("Enable Blend Mode Preserve Specular Lighting", Float) = 1.0 - - [ToggleUI] _DoubleSidedEnable("Double sided enable", Float) = 0.0 - [Enum(Flip, 0, Mirror, 1, None, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1 [HideInInspector] _DoubleSidedConstants("_DoubleSidedConstants", Vector) = (1, 1, -1, 0) [HideInInspector] _UVMappingMask("_UVMappingMask", Color) = (1, 0, 0, 0) @@ -81,13 +74,16 @@ Shader "HDRP/Toon" //TODO: Move more properties here for better organization // Surface Options - [Popup(_SURFACE_TYPE_TRANSPARENT)] _TransparentEnabled("Transparent Mode", Integer) = 0 - [Popup(_ALPHATEST_ON)] _AlphaCutoffEnable("Alpha Cutoff Enable", Integer) = 0.0 + [Enum(Misaki.HdrpToon.SurfaceType)]_SurfaceType("__surfacetype", Integer) = 0 + [Popup(_ENABLE_FOG_ON_TRANSPARENT)] _FogOnTransparent("Fog On Transparent", Integer) = 0 + [Popup(_ALPHATEST_ON)] _AlphaCutoffEnable("Alpha Cutoff Enable", Integer) = 0 _AlphaCutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 [Enum(Off, 0, Front, 1, Back, 2)] _CullMode("Cull Mode", Integer) = 2 - [KeywordEnum(Standard, SDF)] _Shading_Mode("Shading mode", Integer) = 0 - [KeywordEnum(Standard, FrontHair, Face, Eye)] _Material_Type("Material Type", Integer) = 0 - [KeywordEnum(Off, Standard, Anisotropy, Hair, Fabric, Toon)] _PBR_Mode("PBR Mode", Integer) = 0 + [Enum(Misaki.HdrpToon.DoubleSidedMode)] _DoubleSidedNormalMode("Double sided normal mode", Integer) = 1 + + [KeywordEnumType(Misaki.HdrpToon.ShadingMode, Misaki.HdrpToon)] _Shading_Mode("Shading mode", Integer) = 0 + [KeywordEnumType(Misaki.HdrpToon.MaterialType, Misaki.HdrpToon)] _Material_Type("Material Type", Integer) = 0 + [KeywordEnumType(Misaki.HdrpToon.PBRMode, Misaki.HdrpToon)] _PBR_Mode("PBR Mode", Integer) = 0 [PassPopup(HairBlendingTarget)] _HairBlendingTarget("Hair Blending Target", Integer) = 0 [EnumFlagsUI(Misaki.HdrpToon.SurfaceFeature, Misaki.HdrpToon)]_SurfaceFeatures("Surface Features", Integer) = 0 @@ -172,8 +168,8 @@ Shader "HDRP/Toon" _EmissiveExposureWeight("Emissive Pre Exposure", Range(0.0, 1.0)) = 1.0 // Ambient - [KeywordEnum(Off, IBL, MatCap, Ramp)]_Indirect_Diffuse_Mode("_Indirect_Diffuse_Mode", Integer) = 1 - [KeywordEnum(Off, IBL, MatCap)]_Indirect_Specular_Mode("_Indirect_Specular_Mode", Integer) = 1 + [KeywordEnumType(Misaki.HdrpToon.IndirectDiffuseMode, Misaki.HdrpToon)] _Indirect_Diffuse_Mode("_Indirect_Diffuse_Mode", Integer) = 1 + [KeywordEnumType(Misaki.HdrpToon.IndirectSpecularMode, Misaki.HdrpToon)] _Indirect_Specular_Mode("_Indirect_Specular_Mode", Integer) = 1 _IndirectDiffuseMatCapMap("IndirectDiffuseMatCapMap", 2D) = "black" {} _IndirectDiffuseMatCapLod("IndirectDiffuseMatCapMapLOD", Range(-5, 5)) = 0.0 @@ -232,7 +228,7 @@ Shader "HDRP/Toon" _OutlineColorMap("Outline Color Map", 2D) = "white" {} [ToggleUI] _AlbedoAffectOutline("Albedo Affect Outline", Float) = 1 [ToggleUI] _SkyColorAffectOutline("Sky Color Affect Outline", Float) = 1 - _SkyColorIntensity("Sky Color Intensity", Range(0, 5)) = 1 + _SkyColorIntensity("Sky Color Intensity", Range(0, 10)) = 1 _OutlineFadeIn("Outline Fade In", Float) = 50 _OutlineFadeOut("Outline Fade Out", Float) = 100 @@ -256,7 +252,7 @@ Shader "HDRP/Toon" _TexWorldScaleEmissive("Scale to apply on world coordinate", Float) = 1.0 [HideInInspector] _UVMappingMaskEmissive("_UVMappingMaskEmissive", Color) = (1, 0, 0, 0) - [HideInInspector] _DiffusionProfile("Obsolete, kept for migration purpose", Int) = 0 + [HideInInspector] _DiffusionProfile("Obsolete, kept for migration purpose", Integer) = 0 [HideInInspector] _DiffusionProfileAsset("Diffusion Profile Asset", Vector) = (0, 0, 0, 0) [HideInInspector] _DiffusionProfileHash("Diffusion Profile Hash", Float) = 0 } @@ -396,8 +392,9 @@ Shader "HDRP/Toon" #pragma shader_feature_local_fragment _PBR_MODE_OFF + #pragma shader_feature_local _NORMALMAP + #pragma shader_feature_local_fragment _NORMALMAP_TANGENT_SPACE #pragma shader_feature_local_fragment _MASKMAP - #pragma shader_feature_local_fragment _NORMALMAP #pragma shader_feature_local_fragment _ANISOTROPYMAP #pragma shader_feature_local_fragment _SPECULARCOLORMAP @@ -445,8 +442,15 @@ Shader "HDRP/Toon" HLSLPROGRAM + #pragma shader_feature_local _NORMALMAP + #pragma shader_feature_local_fragment _NORMALMAP_TANGENT_SPACE + #pragma shader_feature_local_fragment _MASKMAP + #pragma shader_feature_local_fragment _ANISOTROPYMAP + #pragma shader_feature_local_fragment _SPECULARCOLORMAP + #pragma shader_feature_local _ALPHATEST_ON #pragma shader_feature _SURFACE_TYPE_TRANSPARENT + #pragma shader_feature_local_fragment _ENABLE_FOG_ON_TRANSPARENT // Lightmap memo // DYNAMICLIGHTMAP_ON is used when we have an "enlighten lightmap" ie a lightmap updated at runtime by enlighten.This lightmap contain indirect lighting from realtime lights and realtime emissive material.Offline baked lighting(from baked material / light, @@ -515,9 +519,9 @@ Shader "HDRP/Toon" HLSLPROGRAM - #pragma shader_feature_local_fragment _MASKMAP #pragma shader_feature_local _NORMALMAP #pragma shader_feature_local_fragment _NORMALMAP_TANGENT_SPACE + #pragma shader_feature_local_fragment _MASKMAP #pragma shader_feature_local _ALPHATEST_ON @@ -634,6 +638,10 @@ Shader "HDRP/Toon" HLSLPROGRAM + #pragma shader_feature_local _NORMALMAP + #pragma shader_feature_local_fragment _NORMALMAP_TANGENT_SPACE + #pragma shader_feature_local_fragment _MASKMAP + #pragma shader_feature_local _ALPHATEST_ON #pragma shader_feature _SURFACE_TYPE_TRANSPARENT @@ -666,8 +674,16 @@ Shader "HDRP/Toon" HLSLPROGRAM + #pragma shader_feature_local _NORMALMAP + #pragma shader_feature_local_fragment _NORMALMAP_TANGENT_SPACE + #pragma shader_feature_local_fragment _MASKMAP + #pragma shader_feature_local_fragment _ANISOTROPYMAP + #pragma shader_feature_local_fragment _SPECULARCOLORMAP + #pragma shader_feature_local_fragment _EMISSIVE_COLOR_MAP + #pragma shader_feature_local _ALPHATEST_ON #pragma shader_feature _SURFACE_TYPE_TRANSPARENT + #pragma shader_feature_local_fragment _ENABLE_FOG_ON_TRANSPARENT #pragma multi_compile _ DEBUG_DISPLAY #pragma multi_compile _ LIGHTMAP_ON @@ -718,9 +734,9 @@ Shader "HDRP/Toon" Name "ForwardOnly" Tags { "LightMode" = "ForwardOnly" } - ZWrite [_ZWriteMode] + ZWrite [_ZWrite] ZTest [_ZTestDepthEqualForOpaque] - Cull [_CullMode] + Cull [_CullModeForward] Blend [_SrcBlend] [_DstBlend], [_AlphaSrcBlend] [_AlphaDstBlend] // ForwardOpaque | ForwardTransparent @@ -731,11 +747,10 @@ Shader "HDRP/Toon" Stencil { - Ref[_StencilNo] - - Comp[_StencilComp] - Pass[_StencilOpPass] - Fail[_StencilOpFail] + WriteMask [_StencilWriteMask] + Ref [_StencilRef] + Comp Always + Pass Replace } @@ -782,17 +797,18 @@ Shader "HDRP/Toon" #pragma shader_feature_local_fragment _SHADING_RAMP_MASK_MAP + #pragma shader_feature_local _NORMALMAP + #pragma shader_feature_local_fragment _NORMALMAP_TANGENT_SPACE #pragma shader_feature_local_fragment _MASKMAP - #pragma shader_feature_local_fragment _NORMALMAP #pragma shader_feature_local_fragment _ANISOTROPYMAP #pragma shader_feature_local_fragment _SPECULARCOLORMAP - #pragma shader_feature_local_fragment _EMISSIVE_COLOR_MAP #pragma shader_feature_local_fragment _OUTLINECOLORMAP #pragma shader_feature_local _ALPHATEST_ON #pragma shader_feature _SURFACE_TYPE_TRANSPARENT + #pragma shader_feature_local_fragment _ENABLE_FOG_ON_TRANSPARENT #define PUNCTUAL_SHADOW_MEDIUM @@ -911,7 +927,9 @@ Shader "HDRP/Toon" Tags { "LightMode" = "Outline" } Cull Front - Blend SrcAlpha OneMinusSrcAlpha + + ZWrite On + ZTest LEqual HLSLPROGRAM diff --git a/Runtime/Shaders/Includes/Common/UtsLitData.hlsl b/Runtime/Shaders/Includes/Common/UtsLitData.hlsl index fef1995..362787f 100644 --- a/Runtime/Shaders/Includes/Common/UtsLitData.hlsl +++ b/Runtime/Shaders/Includes/Common/UtsLitData.hlsl @@ -264,7 +264,6 @@ void UtsGetSurfaceAndBuiltinData(FragInputs input, float3 V, inout PositionInput #endif float3 doubleSidedConstants = GetDoubleSidedConstants(); - ApplyDoubleSidedFlipOrMirror(input, doubleSidedConstants); // Apply double sided flip on the vertex normal LayerTexCoord layerTexCoord; diff --git a/Runtime/Shaders/Includes/Lighting/UtsLightEvaluation.hlsl b/Runtime/Shaders/Includes/Lighting/UtsLightEvaluation.hlsl index 222a026..95b22b7 100644 --- a/Runtime/Shaders/Includes/Lighting/UtsLightEvaluation.hlsl +++ b/Runtime/Shaders/Includes/Lighting/UtsLightEvaluation.hlsl @@ -49,6 +49,7 @@ DirectLighting UtsEvaluateBSDF_Directional(LightLoopContext lightLoopContext, Po float3 L = -lightData.forward; SHADOW_TYPE shadow = 1.0; + // TODO: Should we disable the contact shadow? #if _RECEIVE_LIGHT_SHADOW_ON shadow = EvaluateShadow_Directional(lightLoopContext, posInput, lightData, builtinData, bsdfData.geomNormalWS); #endif diff --git a/Runtime/Shaders/Includes/Lighting/UtsMaterialEvaluation.hlsl b/Runtime/Shaders/Includes/Lighting/UtsMaterialEvaluation.hlsl index b70fff6..5301d93 100644 --- a/Runtime/Shaders/Includes/Lighting/UtsMaterialEvaluation.hlsl +++ b/Runtime/Shaders/Includes/Lighting/UtsMaterialEvaluation.hlsl @@ -117,8 +117,8 @@ DirectLighting UtsShadeSurface(PositionInputs posInput, UtsBSDFData bsdfData, Pr if (Max3(lightColor.r, lightColor.g, lightColor.b) > 0.0) { - // SHADOW_TYPE sharpShadow = smoothstep(0.4, 0.6, shadow); - SHADOW_TYPE sharpShadow = shadow; + SHADOW_TYPE sharpShadow = smoothstep(0.4, 0.6, shadow); + //SHADOW_TYPE sharpShadow = shadow; #if _RECEIVE_HAIR_SHADOW_ON && ENABLE_UTS_HAIR_SHAOW sharpShadow *= GetHairShadow(posInput, L); #endif @@ -144,12 +144,12 @@ DirectLighting UtsShadeSurface(PositionInputs posInput, UtsBSDFData bsdfData, Pr float NdotL = dot(bsdfData.normalWS, L); float halfLambert = 0.5 * NdotL + 0.5; - float3 rampColor = SAMPLE_TEXTURE2D_ARRAY(_ShadingRampMap, s_linear_clamp_sampler, float2(halfLambert * sharpShadow.x, rampMask), _ShadingIndex).rgb; + float3 rampColor = SAMPLE_TEXTURE2D_ARRAY_LOD(_ShadingRampMap, s_linear_clamp_sampler, float2(halfLambert * sharpShadow.x, rampMask), _ShadingIndex, 0).rgb; diffuseTerm = bsdfData.diffuseColor * rampColor * INV_PI; specularTerm *= saturate(NdotL) * sharpShadow; #elif _SHADING_MODE_SDF - float3 rampColor = SAMPLE_TEXTURE2D_ARRAY(_ShadingRampMap, s_linear_clamp_sampler, float2(sdfShadowMask * sharpShadow.x, rampMask), _ShadingIndex).rgb; + float3 rampColor = SAMPLE_TEXTURE2D_ARRAY_LOD(_ShadingRampMap, s_linear_clamp_sampler, float2(sdfShadowMask * sharpShadow.x, rampMask), _ShadingIndex, 0).rgb; diffuseTerm = bsdfData.diffuseColor * rampColor * INV_PI; specularTerm = (specularTerm + sdfHighlight) * sdfShadowMask * sharpShadow; diff --git a/Runtime/Shaders/Includes/Properties/UtsUnityPerMaterial.hlsl b/Runtime/Shaders/Includes/Properties/UtsUnityPerMaterial.hlsl index ff8137e..10df47f 100644 --- a/Runtime/Shaders/Includes/Properties/UtsUnityPerMaterial.hlsl +++ b/Runtime/Shaders/Includes/Properties/UtsUnityPerMaterial.hlsl @@ -2,6 +2,8 @@ float _SurfaceFeatures; half _AlphaCutoffEnable; float _AlphaCutoff; +half _BlendMode; +float4 _DoubleSidedConstants; // Shading Color float4 _BaseColor; diff --git a/Runtime/Shaders/Includes/ShaderPass/HDRPToonOutline.hlsl b/Runtime/Shaders/Includes/ShaderPass/HDRPToonOutline.hlsl index 01f0ac3..5448e9a 100644 --- a/Runtime/Shaders/Includes/ShaderPass/HDRPToonOutline.hlsl +++ b/Runtime/Shaders/Includes/ShaderPass/HDRPToonOutline.hlsl @@ -41,7 +41,6 @@ PackedVaryingsType Vert(AttributesMesh inputMesh) #endif // _WRITE_TRANSPARENT_MOTION_VECTOR - #ifdef UNITY_VIRTUAL_TEXTURING #define VT_BUFFER_TARGET SV_Target1 #define EXTRA_BUFFER_TARGET SV_Target2 @@ -49,8 +48,6 @@ PackedVaryingsType Vert(AttributesMesh inputMesh) #define EXTRA_BUFFER_TARGET SV_Target1 #endif - - void Frag(PackedVaryingsToPS packedInput, #ifdef OUTPUT_SPLIT_LIGHTING out float4 outColor : SV_Target0, // outSpecularLighting @@ -89,32 +86,38 @@ void Frag(PackedVaryingsToPS packedInput, float4 objPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)); float4 uv0 = input.texCoord0; - - float3 envLightSource_GradientEquator = ShadeSH9(float4(0, 1, 0, 0)); - float3 envLightSource_SkyboxIntensity = max( - SampleBakedGI_UTS_OutLine(objPos.xyz, float3(0.0, 1.0, 0.0), input.texCoord1.xy, input.texCoord2.xy), - SampleBakedGI_UTS_OutLine(objPos.xyz, float3(0.0, -1.0, -0.0), input.texCoord1.xy, input.texCoord2.xy) - ).rgb; - float3 ambientSkyColor = envLightSource_SkyboxIntensity.rgb > 0.0 ? envLightSource_SkyboxIntensity : envLightSource_GradientEquator; - ambientSkyColor *= GetCurrentExposureMultiplier() * _SkyColorIntensity; - - float3 baseColor = SAMPLE_TEXTURE2D(_BaseColorMap, sampler_BaseColorMap, TRANSFORM_TEX(uv0, _BaseColorMap)).rgb; - baseColor *= _BaseColor.rgb; - float4 outlineColor = _OutlineColor; - outlineColor.rgb = lerp(outlineColor.rgb, outlineColor.rgb + ambientSkyColor, _SkyColorAffectOutline); #if _OUTLINECOLORMAP outlineColor *= SAMPLE_TEXTURE2D(_OutlineColorMap, sampler_OutlineColorMap, TRANSFORM_TEX(uv0, _BaseColorMap)).rgb; #endif - outlineColor.rgb = lerp(outlineColor.rgb, outlineColor.rgb * baseColor, _AlbedoAffectOutline); - - float3 volColor, volOpacity; - uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize(); + float3 baseColor = 1.0; + if (_AlbedoAffectOutline > 0.5) + { + baseColor = SAMPLE_TEXTURE2D(_BaseColorMap, sampler_BaseColorMap, TRANSFORM_TEX(uv0, _BaseColorMap)).rgb; + baseColor *= _BaseColor.rgb; + } + outlineColor.rgb *= baseColor; + + float3 ambientSkyColor = 0.0; + if (_SkyColorAffectOutline > 0.5) + { + float3 envLightSource_GradientEquator = ShadeSH9(float4(0, 1, 0, 0)); + float3 envLightSource_SkyboxIntensity = max( + SampleBakedGI_UTS_OutLine(objPos.xyz, float3(0.0, 1.0, 0.0), input.texCoord1.xy, input.texCoord2.xy), + SampleBakedGI_UTS_OutLine(objPos.xyz, float3(0.0, -1.0, 0.0), input.texCoord1.xy, input.texCoord2.xy) + ).rgb; + ambientSkyColor = envLightSource_SkyboxIntensity.rgb > 0.0 ? envLightSource_SkyboxIntensity : envLightSource_GradientEquator; + ambientSkyColor *= GetCurrentExposureMultiplier() * _SkyColorIntensity; + } + outlineColor.rgb += outlineColor.rgb * ambientSkyColor; + // input.positionSS is SV_Position + uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize(); PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex); float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); + float3 volColor, volOpacity; EvaluateAtmosphericScattering(posInput, V, volColor, volOpacity); // Premultiplied alpha outlineColor.rgb = outlineColor.rgb * (1 - volOpacity) + volColor; outColor = outlineColor; @@ -125,6 +128,4 @@ void Frag(PackedVaryingsToPS packedInput, #ifdef UNITY_VIRTUAL_TEXTURING outVTFeedback = builtinData.vtPackedFeedback; #endif -} -// End of File - +} \ No newline at end of file diff --git a/Runtime/Shaders/Includes/ShaderPass/UtsShaderPassForward.hlsl b/Runtime/Shaders/Includes/ShaderPass/UtsShaderPassForward.hlsl index 85930e2..a38b7e8 100644 --- a/Runtime/Shaders/Includes/ShaderPass/UtsShaderPassForward.hlsl +++ b/Runtime/Shaders/Includes/ShaderPass/UtsShaderPassForward.hlsl @@ -79,22 +79,13 @@ void Frag(PackedVaryingsToPS packedInput, UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput); - FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh); -#if defined(PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER) && SHADER_STAGE_FRAGMENT -#if (defined(VARYINGS_NEED_PRIMITIVEID) || (SHADERPASS == SHADERPASS_FULL_SCREEN_DEBUG)) - input.primitiveID = packedInput.primitiveID; -#endif -#endif - -#if defined(VARYINGS_NEED_CULLFACE) && SHADER_STAGE_FRAGMENT - input.isFrontFace = IS_FRONT_VFACE(packedInput.cullFace, true, false); -#endif + FragInputs input = UnpackVaryingsToFragInputs(packedInput); // We need to readapt the SS position as our screen space positions are for a low res buffer, but we try to access a full res buffer. input.positionSS.xy = _OffScreenRendering > 0 ? (input.positionSS.xy * _OffScreenDownsampleFactor) : input.positionSS.xy; uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize(); PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex); - + #ifdef VARYINGS_NEED_POSITION_WS float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); @@ -119,6 +110,10 @@ void Frag(PackedVaryingsToPS packedInput, SurfaceData tempSurfaceData; BuiltinData builtinData; UtsGetSurfaceAndBuiltinData(input, V, posInput, tempSurfaceData, builtinData); + + float3 doubleSidedConstants = GetDoubleSidedConstants(); + ApplyDoubleSidedFlipOrMirror(input, doubleSidedConstants); + UTSSurfaceData surfaceData = GetUTSSurfaceData(input, V); UtsBSDFData bsdfData = ConvertUTSSurfaceDataToUTSBSDFData(surfaceData); @@ -153,6 +148,10 @@ void Frag(PackedVaryingsToPS packedInput, float4 hairBlendingTex = LOAD_TEXTURE2D_X(_HairBlendingTex, screenUV); outColor.rgb = lerp(outColor.rgb, hairBlendingTex.rgb, hairBlendingTex.a * _HairBlendingFactor); #endif + +#if _ENABLE_FOG_ON_TRANSPARENT && _SURFACE_TYPE_TRANSPARENT + outColor = EvaluateAtmosphericScattering(posInput, V, outColor); +#endif #if UTS_DEBUG_SHADOWMAP || UTS_DEBUG_SELFSHADOW outColor.rgb = 1; @@ -176,5 +175,6 @@ void Frag(PackedVaryingsToPS packedInput, outVTFeedback = builtinData.vtPackedFeedback; #endif - -} + + //outColor.rgb = input.isFrontFace; +} \ No newline at end of file diff --git a/Runtime/UTS Renderer/UTSOutlinePass.cs b/Runtime/UTS Renderer/UTSOutlinePass.cs index 208df2b..7dc5f6b 100644 --- a/Runtime/UTS Renderer/UTSOutlinePass.cs +++ b/Runtime/UTS Renderer/UTSOutlinePass.cs @@ -23,10 +23,10 @@ namespace Misaki.HdrpToon Shader.SetGlobalFloat("_Outline_MaxWidth", utsRenderer.outlineMaxWidth.value * 0.01f); var renderConfig = HDUtils.GetRendererConfiguration(false, false); - var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(UtsShaderPassName.outlinePassId, ctx.cullingResults, ctx.hdCamera.camera) + var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(UTSPassName.outlinePassId, ctx.cullingResults, ctx.hdCamera.camera) { rendererConfiguration = renderConfig, - renderQueueRange = GetRenderQueueRange(RenderQueueType.All), + renderQueueRange = GetRenderQueueRange(RenderQueueType.AllOpaque), excludeObjectMotionVectors = false, }; diff --git a/Runtime/UTS Renderer/UTSPass.cs b/Runtime/UTS Renderer/UTSPass.cs index 5a1259f..37cea74 100644 --- a/Runtime/UTS Renderer/UTSPass.cs +++ b/Runtime/UTS Renderer/UTSPass.cs @@ -127,9 +127,9 @@ namespace Misaki.HdrpToon } } - private bool ShouldReallocateHairShadowBuffer() + private static bool IsRTHandleValid(RTHandle rtHandle) { - return _hairShadowRTHandle == null || _hairShadowRTHandle.rt == null || !_hairShadowRTHandle.rt.IsCreated() || _needReallocateHairShadow; + return rtHandle != null && rtHandle.rt != null && rtHandle.rt.IsCreated(); } private void ReallocateHairShadowBuffer() @@ -156,11 +156,6 @@ namespace Misaki.HdrpToon _needReallocateHairShadow = false; } - private bool ShouldReallocateHairBlendingBuffer() - { - return _hairBlendingRTHandle == null || _hairBlendingRTHandle.rt == null || !_hairBlendingRTHandle.rt.IsCreated() || _needReallocateHairBlending; - } - private void ReallocateHairBlendingBuffer() { #if UNITY_EDITOR @@ -262,7 +257,7 @@ namespace Misaki.HdrpToon return; } - if (ShouldReallocateHairShadowBuffer()) + if (!IsRTHandleValid(_hairShadowRTHandle) || _needReallocateHairShadow) { ReallocateHairShadowBuffer(); return; @@ -272,7 +267,7 @@ namespace Misaki.HdrpToon { CoreUtils.SetRenderTarget(ctx.cmd, _hairShadowRTHandle, ClearFlag.Depth); - var result = new RendererListDesc(UtsShaderPassName.hairShadowCasterPassId, ctx.cullingResults, ctx.hdCamera.camera) + var result = new RendererListDesc(UTSPassName.hairShadowCasterPassId, ctx.cullingResults, ctx.hdCamera.camera) { renderQueueRange = GetRenderQueueRange(RenderQueueType.AllOpaque), sortingCriteria = SortingCriteria.CommonOpaque, @@ -296,7 +291,7 @@ namespace Misaki.HdrpToon return; } - if (ShouldReallocateHairBlendingBuffer()) + if (!IsRTHandleValid(_hairBlendingRTHandle) || _needReallocateHairBlending) { ReallocateHairBlendingBuffer(); return; @@ -306,7 +301,7 @@ namespace Misaki.HdrpToon { CoreUtils.SetRenderTarget(ctx.cmd, _hairBlendingRTHandle, _hairBlendingDepthRTHandle, ClearFlag.Color | ClearFlag.Depth); - var result = new RendererListDesc(UtsShaderPassName.hairBlendingTargetPassId, ctx.cullingResults, ctx.hdCamera.camera) + var result = new RendererListDesc(UTSPassName.hairBlendingTargetPassId, ctx.cullingResults, ctx.hdCamera.camera) { renderQueueRange = GetRenderQueueRange(RenderQueueType.AllOpaque), sortingCriteria = SortingCriteria.CommonOpaque, diff --git a/Runtime/UTS Renderer/UTSRenderPassRegistrar.cs b/Runtime/UTS Renderer/UTSRenderPassRegistrar.cs index f1cf953..da511f1 100644 --- a/Runtime/UTS Renderer/UTSRenderPassRegistrar.cs +++ b/Runtime/UTS Renderer/UTSRenderPassRegistrar.cs @@ -31,7 +31,7 @@ namespace Misaki.HdrpToon targetDepthBuffer = CustomPass.TargetBuffer.None, }; - _outlinePass = new() + _outlinePass = new UTSOutlinePass() { name = "UTS Outline", targetColorBuffer = CustomPass.TargetBuffer.Camera, @@ -39,7 +39,7 @@ namespace Misaki.HdrpToon }; CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.AfterOpaqueDepthAndNormal, _utsPass); - CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.BeforePostProcess, _outlinePass); + CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.BeforeTransparent, _outlinePass); NotifyRendererSettingChanged(); } diff --git a/Runtime/UTSAPI.cs b/Runtime/UTSAPI.cs index f416c43..c3e4a84 100644 --- a/Runtime/UTSAPI.cs +++ b/Runtime/UTSAPI.cs @@ -1,6 +1,6 @@ using UnityEngine; using UnityEngine.Rendering; -using static Misaki.HdrpToon.UtsShaderPropertyName; +using static Misaki.HdrpToon.UTSPropertyName; namespace Misaki.HdrpToon { @@ -25,43 +25,109 @@ namespace Misaki.HdrpToon public static void SetupPass(Material material) { - material.SetShaderPassEnabled(UtsShaderPassName.HAIR_SHADOW_CASTER_PASS_NAME, (MaterialType)material.GetInteger(SurfaceOptions.MATERIAL_TYPE) == MaterialType.FrontHair); - material.SetShaderPassEnabled(UtsShaderPassName.HAIR_BLENDING_TARGET_PASS_NAME, material.GetInteger(SurfaceOptions.HAIR_BLENDING_TARGET) == 1); - } - - private static void ResetMaterialCustomRenderQueue(Material material) - { - var isTransparent = material.GetInteger(SurfaceOptions.TRANSPARENT_ENABLED) > 0.0f; - var isAlphaClip = material.GetInteger(SurfaceOptions.ALPHA_CLIP_ENABLE) > 0.0f; - - var renderQueue = isTransparent ? RenderPriority.Transparent : (isAlphaClip ? RenderPriority.OpaqueAlphaTest : RenderPriority.Opaque); - material.renderQueue = (int)renderQueue; - } - - public static void SetupProperties(Material material) - { - ResetMaterialCustomRenderQueue(material); - - // We only do clip for alpha clip in depth pre-pass once. Z test for Gbuffer and forward pass need to set to equal to make sure alpha clip works correctly. - if (material.GetInteger("_AlphaCutoffEnable") > 0.0f) - { - material.SetInt("_ZTestGBuffer", (int)CompareFunction.Equal); - } - else - { - material.SetInt("_ZTestGBuffer", (int)CompareFunction.LessEqual); - } - - //if (surfaceType == SurfaceType.Opaque) - //{ - material.SetInt("_ZTestDepthEqualForOpaque", (int)CompareFunction.Equal); - //} - //else - // material.SetInt(kZTestDepthEqualForOpaque, (int)material.GetTransparentZTest()); + material.SetShaderPassEnabled(UTSPassName.HAIR_SHADOW_CASTER_PASS_NAME, (MaterialType)material.GetInteger(SurfaceOptions.MATERIAL_TYPE) == MaterialType.FrontHair); + material.SetShaderPassEnabled(UTSPassName.HAIR_BLENDING_TARGET_PASS_NAME, material.GetInteger(SurfaceOptions.HAIR_BLENDING_TARGET) == 1); } public static void SetupKeywords(Material material) { + var surfaceType = (SurfaceType)material.GetInteger(SurfaceOptions.SURFACE_TYPE); + var cullMode = (CullMode)material.GetInteger(SurfaceOptions.CULL_MODE); + var doubleSidedEnable = cullMode == CullMode.Off; + + CoreUtils.SetKeyword(material, "_SURFACE_TYPE_TRANSPARENT", surfaceType == SurfaceType.Transparent); + CoreUtils.SetKeyword(material, "_DOUBLESIDED_ON", doubleSidedEnable); + } + + public static void SetupProperties(Material material) + { + var surfaceType = (SurfaceType)material.GetInteger(SurfaceOptions.SURFACE_TYPE); + var cullMode = (CullMode)material.GetInteger(SurfaceOptions.CULL_MODE); + + // Surface type + var isTransparent = surfaceType == SurfaceType.Transparent; + var isAlphaClip = material.GetInteger(SurfaceOptions.ALPHA_CLIP_ENABLE) == 1; + + var renderQueue = isTransparent ? RenderPriority.Transparent : (isAlphaClip ? RenderPriority.OpaqueAlphaTest : RenderPriority.Opaque); + material.SetInteger(InternalProperties.SURFACE_TYPE, isTransparent ? 1 : 0); + material.renderQueue = (int)renderQueue; + + // We only do clip for alpha clip in depth pre-pass once. Z test for GBuffer and forward pass need to set to equal to make sure alpha clip works correctly. + if (isAlphaClip) + { + material.SetInteger(InternalProperties.ZTEST_GBUFFER, (int)CompareFunction.Equal); + } + else + { + material.SetInteger(InternalProperties.ZTEST_GBUFFER, (int)CompareFunction.LessEqual); + } + + if (isTransparent) + { + material.SetInteger(InternalProperties.ZTEST_DEPTH_EQUAL_FOR_OPAQUE, material.GetInteger(InternalProperties.ZTEST_TRANSPARENT)); + + material.SetOverrideTag("RenderType", "Transparent"); + // TODO: Z write for transparent. + material.SetInteger(InternalProperties.ZWRITE, 0); + material.SetInteger(InternalProperties.DEST_BLEND2, (int)BlendMode.OneMinusSrcAlpha); + + //TODO: Implement additive and pre-multiply mode. + material.SetInteger(InternalProperties.SRC_BLEND, (int)BlendMode.One); + material.SetInteger(InternalProperties.DEST_BLEND, (int)BlendMode.OneMinusSrcAlpha); + material.SetInteger(InternalProperties.ALPHA_SRC_BLEND, (int)BlendMode.One); + material.SetInteger(InternalProperties.ALPHA_DEST_BLEND, (int)BlendMode.OneMinusSrcAlpha); + } + else + { + material.SetInteger(InternalProperties.ZTEST_DEPTH_EQUAL_FOR_OPAQUE, (int)CompareFunction.Equal); + + material.SetOverrideTag("RenderType", isAlphaClip ? "TransparentCutout" : ""); + + material.SetInteger(InternalProperties.SRC_BLEND, (int)BlendMode.One); + material.SetInteger(InternalProperties.DEST_BLEND, (int)BlendMode.Zero); + material.SetInteger(InternalProperties.DEST_BLEND2, (int)BlendMode.Zero); + // Caution: we need to setup One for src and Zero for Dst for all element as users could switch from transparent to Opaque and keep remaining value. + // Unity will disable Blending based on these default value. + // Note that for after postprocess we setup 0 in opacity inside the shaders, so we correctly end with 0 in opacity for the compositing pass + material.SetInteger(InternalProperties.ALPHA_SRC_BLEND, (int)BlendMode.One); + material.SetInteger(InternalProperties.ALPHA_DEST_BLEND, (int)BlendMode.Zero); + material.SetInteger(InternalProperties.ZWRITE, 1); + } + + // Double sided + var isBackFaceEnable = material.GetInteger(InternalProperties.TRANSPARENT_BACKFACE_ENABLE) == 1 && surfaceType == SurfaceType.Transparent; + var doubleSidedEnable = cullMode == CullMode.Off; + + if (doubleSidedEnable) + { + var doubleSidedNormalMode = (DoubleSidedMode)material.GetInteger(SurfaceOptions.DOUBLE_SIDED_NORMAL_MODE); + switch (doubleSidedNormalMode) + { + case DoubleSidedMode.None: + material.SetVector(InternalProperties.DOUBLE_SIDED_CONSTANTS, new Vector4(1.0f, 1.0f, 1.0f, 0.0f)); + break; + + case DoubleSidedMode.Mirror: + material.SetVector(InternalProperties.DOUBLE_SIDED_CONSTANTS, new Vector4(1.0f, 1.0f, -1.0f, 0.0f)); + break; + + case DoubleSidedMode.Flip: + material.SetVector(InternalProperties.DOUBLE_SIDED_CONSTANTS, new Vector4(-1.0f, -1.0f, -1.0f, 0.0f)); + break; + } + } + + if (isBackFaceEnable) + { + material.SetInt(InternalProperties.CULL_MODE_FORWARD, (int)CullMode.Back); + } + else + { + material.SetInteger(InternalProperties.CULL_MODE_FORWARD, (int)(doubleSidedEnable ? CullMode.Off : cullMode)); + } + + // TODO: Setup stencil value. Currently it produce noticeable jittering when surface type is transparent. + // This is caused by taa, _StencilWriteMask need to include StencilUsage.ExcludeFromTUAndAA when surface type is transparent. } } } \ No newline at end of file