3 Commits
2.0.4 ... 2.0.5

Author SHA1 Message Date
Misaki
9f86d53804 Update the version to 2.0.5 2025-01-08 23:12:47 +09:00
Misaki
968b83870f Removed the dependency of layer mask of hair shadow caster;
Added HairShadowCaster pass;
2025-01-08 23:09:55 +09:00
Misaki
a7a9ad16b5 Updated namespace;
Added UTSPass;
Chnaged the RTHanlde _HairShadowMap to not reallocate when screen resolution decreased;
2025-01-08 22:19:04 +09:00
38 changed files with 510 additions and 690 deletions

View File

@@ -2,6 +2,17 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [2.0.5] - 08-Jan-2025
### Added
- Added UTSPass custom pass;
- Added HairShadowCaster shader pass;
### Changed
- Chnaged the RTHanlde _HairShadowMap to not reallocate when screen resolution decreased;
- Changed namespace;
- Removed the dependency of layer mask of hair shadow caster;
## [2.0.2] - 26-Dec-2024 ## [2.0.2] - 26-Dec-2024
### Changed ### Changed

View File

@@ -1,13 +1,10 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; using UnityEditor;
using Unity.Rendering.Toon;
namespace UnityEditor.Rendering.Toon namespace Misaki.HdrpToon.Editor
{ {
[CustomEditor(typeof(DebugShadowmap))] [CustomEditor(typeof(DebugShadowmap))]
internal class DebugShadowmapInspector : Editor internal class DebugShadowmapInspector : UnityEditor.Editor
{ {
public override void OnInspectorGUI() public override void OnInspectorGUI()
@@ -19,14 +16,14 @@ namespace UnityEditor.Rendering.Toon
bool isChanged = false; var isChanged = false;
var obj = target as DebugShadowmap; var obj = target as DebugShadowmap;
// hi cut filter // hi cut filter
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool showShadow = EditorGUILayout.Toggle(labelDebugShadowmap, obj.m_enableShadowmapDebugging); var showShadow = EditorGUILayout.Toggle(labelDebugShadowmap, obj.m_enableShadowmapDebugging);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
Undo.RecordObject(target, "Changed Shadowmap debbuging flag"); Undo.RecordObject(target, "Changed Shadowmap debbuging flag");
@@ -41,7 +38,7 @@ namespace UnityEditor.Rendering.Toon
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool binalization = EditorGUILayout.Toggle(labelBinalization, obj.m_enableBinalization); var binalization = EditorGUILayout.Toggle(labelBinalization, obj.m_enableBinalization);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
@@ -59,7 +56,7 @@ namespace UnityEditor.Rendering.Toon
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool showSlefShadow = EditorGUILayout.Toggle(labelDebugSelfShadow, obj.m_enableSelfShadowDebugging); var showSlefShadow = EditorGUILayout.Toggle(labelDebugSelfShadow, obj.m_enableSelfShadowDebugging);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
@@ -72,7 +69,7 @@ namespace UnityEditor.Rendering.Toon
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool showOutline = EditorGUILayout.Toggle(labelNoOutline, obj.m_enableOutlineDebugging); var showOutline = EditorGUILayout.Toggle(labelNoOutline, obj.m_enableOutlineDebugging);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {

View File

@@ -3,7 +3,7 @@ using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace Unity.Toonshader.Editor namespace Misaki.HdrpToon.Editor
{ {
public class ConverterInitializer public class ConverterInitializer
{ {

View File

@@ -1,6 +1,6 @@
using UnityEngine; using UnityEngine;
namespace Unity.Toonshader.Editor namespace Misaki.HdrpToon.Editor
{ {
public struct QuaternionToVector3Converter public struct QuaternionToVector3Converter
{ {

View File

@@ -1,13 +1,11 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; using UnityEditor;
using Unity.Rendering.Toon; using UnityEngine;
namespace UnityEditor.Rendering.Toon
namespace Misaki.HdrpToon.Editor
{ {
[CustomEditor(typeof(ModelToonEvAdjustment))] [CustomEditor(typeof(ModelToonEvAdjustment))]
internal class ModelToonEvAdjustmentInspector : Editor internal class ModelToonEvAdjustmentInspector : UnityEditor.Editor
{ {
SerializedObject m_SerializedObject; SerializedObject m_SerializedObject;
@@ -20,14 +18,14 @@ namespace UnityEditor.Rendering.Toon
const string labeIgnoreVolumeExposure = "Ignore Volume Exposure"; const string labeIgnoreVolumeExposure = "Ignore Volume Exposure";
const string labelCompensation = "Compensation"; const string labelCompensation = "Compensation";
bool isChanged = false; var isChanged = false;
var obj = target as ModelToonEvAdjustment; var obj = target as ModelToonEvAdjustment;
// hi cut filter // hi cut filter
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool egnoreExposure = EditorGUILayout.Toggle(labeIgnoreVolumeExposure, obj.m_IgnorVolumeExposure); var egnoreExposure = EditorGUILayout.Toggle(labeIgnoreVolumeExposure, obj.m_IgnorVolumeExposure);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
Undo.RecordObject(target, "Changed Ignore Volume Exposure"); Undo.RecordObject(target, "Changed Ignore Volume Exposure");
@@ -38,7 +36,7 @@ namespace UnityEditor.Rendering.Toon
// hi cut filter // hi cut filter
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool lightFilterr = EditorGUILayout.Toggle(labelLightHighCutFilter, obj.m_ToonLightHiCutFilter); var lightFilterr = EditorGUILayout.Toggle(labelLightHighCutFilter, obj.m_ToonLightHiCutFilter);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
Undo.RecordObject(target, "Changed Light Hi Cut Filter"); Undo.RecordObject(target, "Changed Light Hi Cut Filter");
@@ -50,7 +48,7 @@ namespace UnityEditor.Rendering.Toon
// Compensation // Compensation
EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
float compensation = EditorGUILayout.FloatField(labelCompensation, obj.m_Compensation); var compensation = EditorGUILayout.FloatField(labelCompensation, obj.m_Compensation);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
Undo.RecordObject(target, "Changed Compensation"); Undo.RecordObject(target, "Changed Compensation");
@@ -62,7 +60,7 @@ namespace UnityEditor.Rendering.Toon
// curve // curve
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool exposureAdjustment = EditorGUILayout.Toggle(labelLightAdjustment, obj.m_ExposureAdjustmnt); var exposureAdjustment = EditorGUILayout.Toggle(labelLightAdjustment, obj.m_ExposureAdjustmnt);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
Undo.RecordObject(target, "Changed Expsure Adjustment"); Undo.RecordObject(target, "Changed Expsure Adjustment");
@@ -82,7 +80,7 @@ namespace UnityEditor.Rendering.Toon
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
// var ranges = new Rect(-10, -10, 20, 20); // var ranges = new Rect(-10, -10, 20, 20);
// var curve = EditorGUILayout.CurveField(labelExposureCurave, obj.m_AnimationCurve, Color.green,ranges); // var curve = EditorGUILayout.CurveField(labelExposureCurave, obj.m_AnimationCurve, Color.green,ranges);
AnimationCurve curve = EditorGUILayout.CurveField(labelLightAdjustmentCurve, obj.m_AnimationCurve); var curve = EditorGUILayout.CurveField(labelLightAdjustmentCurve, obj.m_AnimationCurve);
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
@@ -91,7 +89,7 @@ namespace UnityEditor.Rendering.Toon
isChanged = true; isChanged = true;
} }
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
bool buttonIsPressed = GUILayout.Button("Reset", GUILayout.Width(50)); var buttonIsPressed = GUILayout.Button("Reset", GUILayout.Width(50));
var curve2 = obj.m_AnimationCurve; var curve2 = obj.m_AnimationCurve;
if (buttonIsPressed) if (buttonIsPressed)
{ {
@@ -134,7 +132,7 @@ namespace UnityEditor.Rendering.Toon
float ConvertFromEV100(float EV100) float ConvertFromEV100(float EV100)
{ {
float val = Mathf.Pow(2, EV100) * 2.5f; var val = Mathf.Pow(2, EV100) * 2.5f;
return val; return val;
} }

View File

@@ -1,9 +1,8 @@
using Unity.Rendering.HighDefinition.Toon;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace Unity.Toonshader.Editor namespace Misaki.HdrpToon.Editor
{ {
[CustomEditor(typeof(BoxLightAdjustment))] [CustomEditor(typeof(BoxLightAdjustment))]
public class BoxLightAdjustmentView : UnityEditor.Editor public class BoxLightAdjustmentView : UnityEditor.Editor

View File

@@ -1,6 +1,7 @@
//#define USE_SIMPLE_UI //#define USE_SIMPLE_UI
using Misaki.HdrpToon;
using System; using System;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering; using UnityEngine.Rendering;
@@ -51,24 +52,6 @@ namespace UnityEditor.Rendering.Toon
} }
} }
internal static string OutlineLightingModeName
{
get
{
const string legacyDefaultLightModeName = "Always";
const string OutlineLightingModeName = "Outline";
if (currentRenderPipeline == RenderPipeline.Legacy)
{
return legacyDefaultLightModeName; // default.
}
return OutlineLightingModeName;
}
}
internal void RenderingPerChennelsSetting(Material material) internal void RenderingPerChennelsSetting(Material material)
{ {
if (currentRenderPipeline == RenderPipeline.HDRP) if (currentRenderPipeline == RenderPipeline.HDRP)
@@ -121,6 +104,12 @@ namespace UnityEditor.Rendering.Toon
internal const string ShaderProp_OutlineTex = "_OutlineTex"; internal const string ShaderProp_OutlineTex = "_OutlineTex";
internal const string ShaderProp_Outline_Sampler = "_Outline_Sampler"; internal const string ShaderProp_Outline_Sampler = "_Outline_Sampler";
internal const string ShaderPropCastHairShadow = "_Is_CastHairShadow";
internal const string ShaderPropReceiveHairShadow = "_Is_ReceiveHairShadow";
internal const string ShaderPropEyeParallax = "_Is_EyeParallax";
internal const string ShaderPropEyebrowSeethrough = "_Is_EyebrowSeethrough";
internal const string ShaderPropSimpleUI = "_simpleUI"; internal const string ShaderPropSimpleUI = "_simpleUI";
internal const string ShaderPropAutoRenderQueue = "_AutoRenderQueue"; internal const string ShaderPropAutoRenderQueue = "_AutoRenderQueue";
internal const string ShaderPropStencilMode = "_StencilMode"; internal const string ShaderPropStencilMode = "_StencilMode";
@@ -216,17 +205,13 @@ namespace UnityEditor.Rendering.Toon
internal const string ShaderDefineIS_CLIPPING_MATTE = "_IS_CLIPPING_MATTE"; internal const string ShaderDefineIS_CLIPPING_MATTE = "_IS_CLIPPING_MATTE";
internal const string ShaderPropReceiveHairShadow = "_Is_ReceiveHairShadow";
internal const string ShaderPropEyeParallax = "_Is_EyeParallax";
internal const string ShaderPropEyebrowSeethrough = "_Is_EyebrowSeethrough";
protected readonly string[] UtsModeNames = { "Standard", "PBR" }; protected readonly string[] UtsModeNames = { "Standard", "PBR" };
protected readonly string[] EmissiveScrollMode = { "UV Coordinate Scroll", "View Coordinate Scroll" }; protected readonly string[] EmissiveScrollMode = { "UV Coordinate Scroll", "View Coordinate Scroll" };
protected readonly string[] ClippingModeNames = { "Off", "On", "Clip Transparency" }; protected readonly string[] ClippingModeNames = { "Off", "On", "Clip Transparency" };
protected readonly string[] StencilModeNames = { "Off", "Draw If Not Equal to", "Replace Stencil Buffer with" }; protected readonly string[] StencilModeNames = { "Off", "Draw If Not Equal to", "Replace Stencil Buffer with" };
protected readonly string[] ZTestModeNames = { "Disabled", "Never", "Less", "Equal", "LessEqual", "Greater", "NotEqual", "GreaterEqual", "Always" }; protected readonly string[] ZTestModeNames = { "Disabled", "Never", "Less", "Equal", "LessEqual", "Greater", "NotEqual", "GreaterEqual", "Always" };
protected readonly string[] PbrModeDefines = { "_PBR_Mode_OFF", "_PBR_Mode_ST", "_PBR_Mode_ANISO", "_PBR_Mode_KK", "_PBR_Mode_TOON" };
public enum UTS_ClippingMode public enum UTS_ClippingMode
{ {
@@ -699,7 +684,8 @@ namespace UnityEditor.Rendering.Toon
public static readonly GUIContent highlightOnShadowText = new GUIContent("Highlight Blending on Shadows", "Control the blending for the highlights in shadows, this also control the rim light."); public static readonly GUIContent highlightOnShadowText = new GUIContent("Highlight Blending on Shadows", "Control the blending for the highlights in shadows, this also control the rim light.");
public static readonly GUIContent lightColorEffectiveness = EditorGUIUtility.TrTextContent("Light Color Effectiveness", "light color effectiveness to each parameter."); public static readonly GUIContent lightColorEffectiveness = EditorGUIUtility.TrTextContent("Light Color Effectiveness", "light color effectiveness to each parameter.");
public static readonly GUIContent receiveHairShadowText = new GUIContent("Receive Hair Shadow", "Do you want this material to receive hair shadow"); public static readonly GUIContent hairShadowCasterText = new GUIContent("Hair Shadow Caster", "Enable to cast hair shadow");
public static readonly GUIContent receiveHairShadowText = new GUIContent("Receive Hair Shadow", "Enable to receive shadow from hair shadow caster");
public static readonly GUIContent eyeParallaxText = new GUIContent("Eye Parallax Correction", "Enables parallax correction for eye material"); public static readonly GUIContent eyeParallaxText = new GUIContent("Eye Parallax Correction", "Enables parallax correction for eye material");
public static readonly GUIContent eyebrowSeethroughText = new GUIContent("Eyebrow Seethrough", "Enable for eyebrow material to be blended with hair. Must configure HairShadowPass to work."); public static readonly GUIContent eyebrowSeethroughText = new GUIContent("Eyebrow Seethrough", "Enable for eyebrow material to be blended with hair. Must configure HairShadowPass to work.");
@@ -1012,17 +998,6 @@ namespace UnityEditor.Rendering.Toon
} }
// -------------------------------- // --------------------------------
public UTS3GUI()
{
}
public override void OnClosed(Material material)
{
base.OnClosed(material);
}
void OnOpenGUI(Material material, MaterialEditor materialEditor, MaterialProperty[] props) void OnOpenGUI(Material material, MaterialEditor materialEditor, MaterialProperty[] props)
{ {
m_MaterialScopeList.RegisterHeaderScope(Styles.shaderFoldout, Expandable.Shader, DrawShaderOptions, (uint)UTS_TransparentMode.Off, isTessellation: 0); m_MaterialScopeList.RegisterHeaderScope(Styles.shaderFoldout, Expandable.Shader, DrawShaderOptions, (uint)UTS_TransparentMode.Off, isTessellation: 0);
@@ -1199,7 +1174,7 @@ namespace UnityEditor.Rendering.Toon
EditorGUILayout.Space(10); EditorGUILayout.Space(10);
var headerStyle = new GUIStyle() { fontSize = 25, fontStyle = FontStyle.Bold, alignment = TextAnchor.MiddleCenter }; var headerStyle = new GUIStyle() { fontSize = 25, fontStyle = FontStyle.Bold, alignment = TextAnchor.MiddleCenter };
headerStyle.normal.textColor = GUI.skin.label.normal.textColor; headerStyle.normal.textColor = GUI.skin.label.normal.textColor;
EditorGUILayout.LabelField("Unity Toon Shader", headerStyle); EditorGUILayout.LabelField("HDRP Toon Shader", headerStyle);
EditorGUILayout.Space(20); EditorGUILayout.Space(20);
if (transparencyEnabled != UTS_TransparentMode.On) if (transparencyEnabled != UTS_TransparentMode.On)
@@ -1383,22 +1358,8 @@ namespace UnityEditor.Rendering.Toon
//If the value changes, write to the material. //If the value changes, write to the material.
if (_CullMode_Setting != (int)m_cullingMode) if (_CullMode_Setting != (int)m_cullingMode)
{ {
switch (m_cullingMode) MaterialSetInt(material, _CullMode, (int)m_cullingMode);
{
case CullingMode.Off:
MaterialSetInt(material, _CullMode, 0);
break;
case CullingMode.Frontface:
MaterialSetInt(material, _CullMode, 1);
break;
default:
MaterialSetInt(material, _CullMode, 2);
break;
} }
}
} }
void GUI_Tranparent(Material material) void GUI_Tranparent(Material material)
{ {
@@ -1559,17 +1520,14 @@ namespace UnityEditor.Rendering.Toon
void GUI_HairShadow(Material material) void GUI_HairShadow(Material material)
{ {
var isEnabled = GUI_Toggle(material, Styles.receiveHairShadowText, ShaderPropReceiveHairShadow, var isCastEnable = GUI_Toggle(material, Styles.hairShadowCasterText, ShaderPropCastHairShadow,
MaterialGetInt(material, ShaderPropCastHairShadow) != 0);
var isReceiveEnabled = GUI_Toggle(material, Styles.receiveHairShadowText, ShaderPropReceiveHairShadow,
MaterialGetInt(material, ShaderPropReceiveHairShadow) != 0); MaterialGetInt(material, ShaderPropReceiveHairShadow) != 0);
if (isEnabled) material.SetShaderPassEnabled(UtsShaderPassName.HAIR_SHADOW_CASTER_PASS_NAME, isCastEnable);
{ material.SetKeyword(new LocalKeyword(material.shader, "_RECEIVE_HAIR_SHADOW"), isReceiveEnabled);
material.EnableKeyword(new LocalKeyword(material.shader, "_RECEIVE_HAIR_SHADOW"));
}
else
{
material.DisableKeyword(new LocalKeyword(material.shader, "_RECEIVE_HAIR_SHADOW"));
}
} }
void GUI_EyeParallax(Material material) void GUI_EyeParallax(Material material)
@@ -1718,64 +1676,23 @@ namespace UnityEditor.Rendering.Toon
m_pbrMode = (PBRMode)EditorGUILayout.EnumPopup(Styles.pbrModeText, m_pbrMode); m_pbrMode = (PBRMode)EditorGUILayout.EnumPopup(Styles.pbrModeText, m_pbrMode);
EditorGUILayout.Space(); EditorGUILayout.Space();
switch (m_pbrMode) void SwitchPbrMode(string targetMode)
{ {
case PBRMode.Off: foreach (var pbrMode in PbrModeDefines)
{ {
material.SetFloat(ShaderPropPBR, (int)PBRMode.Off); if (targetMode == pbrMode)
{
material.EnableKeyword(pbrMode);
}
else
{
material.DisableKeyword(pbrMode);
}
}
}
material.EnableKeyword("_PBR_Mode_OFF"); material.SetFloat(ShaderPropPBR, (int)m_pbrMode);
material.DisableKeyword("_PBR_Mode_ST"); SwitchPbrMode(PbrModeDefines[(int)m_pbrMode]);
material.DisableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON");
}
break;
case PBRMode.Standard:
{
material.SetFloat(ShaderPropPBR, (int)PBRMode.Standard);
material.DisableKeyword("_PBR_Mode_OFF");
material.EnableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON");
}
break;
case PBRMode.Anisotropy:
{
material.SetFloat(ShaderPropPBR, (int)PBRMode.Anisotropy);
material.DisableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST");
material.EnableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON");
}
break;
case PBRMode.KKHair:
{
material.SetFloat(ShaderPropPBR, (int)PBRMode.KKHair);
material.DisableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO");
material.EnableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON");
}
break;
case PBRMode.Toon:
{
material.SetFloat(ShaderPropPBR, (int)PBRMode.Toon);
material.DisableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK");
material.EnableKeyword("_PBR_Mode_TOON");
}
break;
}
m_MaterialEditor.TexturePropertySingleLine(Styles.normalMapText, normalMap, normalScale); m_MaterialEditor.TexturePropertySingleLine(Styles.normalMapText, normalMap, normalScale);
@@ -2406,18 +2323,18 @@ namespace UnityEditor.Rendering.Toon
internal static void SetupOverDrawTransparentObject(Material material) internal static void SetupOverDrawTransparentObject(Material material)
{ {
var srpDefaultLightModeTag = material.GetTag("LightMode", false, OutlineLightingModeName); var srpDefaultLightModeTag = material.GetTag("LightMode", false, UtsShaderPassName.OUTLINE_PASS_NAME);
if (srpDefaultLightModeTag == OutlineLightingModeName) if (srpDefaultLightModeTag == UtsShaderPassName.OUTLINE_PASS_NAME)
{ {
material.SetShaderPassEnabled(OutlineLightingModeName, true); material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, true);
MaterialSetInt(material, srpDefaultColorMask, 0); MaterialSetInt(material, srpDefaultColorMask, 0);
MaterialSetInt(material, srpDefaultCullMode, (int)CullingMode.Backface); MaterialSetInt(material, srpDefaultCullMode, (int)CullingMode.Backface);
} }
} }
internal static void SetupOutline(Material material) internal static void SetupOutline(Material material)
{ {
var srpDefaultLightModeTag = material.GetTag("LightMode", false, OutlineLightingModeName); var srpDefaultLightModeTag = material.GetTag("LightMode", false, UtsShaderPassName.OUTLINE_PASS_NAME);
if (srpDefaultLightModeTag == OutlineLightingModeName) if (srpDefaultLightModeTag == UtsShaderPassName.OUTLINE_PASS_NAME)
{ {
MaterialSetInt(material, srpDefaultColorMask, 15); MaterialSetInt(material, srpDefaultColorMask, 15);
MaterialSetInt(material, srpDefaultCullMode, (int)CullingMode.Frontface); MaterialSetInt(material, srpDefaultCullMode, (int)CullingMode.Frontface);
@@ -2427,15 +2344,12 @@ namespace UnityEditor.Rendering.Toon
{ {
EditorGUILayout.HelpBox("You need to add OutlinePass in custom pass to make outline work properly", MessageType.Warning); EditorGUILayout.HelpBox("You need to add OutlinePass in custom pass to make outline work properly", MessageType.Warning);
const string kDisableOutlineKeyword = "_DISABLE_OUTLINE"; var srpDefaultLightModeTag = material.GetTag("LightMode", false, UtsShaderPassName.OUTLINE_PASS_NAME);
var isLegacy = (OutlineLightingModeName == "Always");
var srpDefaultLightModeTag = material.GetTag("LightMode", false, OutlineLightingModeName);
var isOutlineEnabled = true; var isOutlineEnabled = true;
if (srpDefaultLightModeTag == OutlineLightingModeName) if (srpDefaultLightModeTag == UtsShaderPassName.OUTLINE_PASS_NAME)
{ {
const string kOutline = "Outline"; const string kOutline = "Outline";
isOutlineEnabled = material.GetShaderPassEnabled(OutlineLightingModeName); isOutlineEnabled = material.GetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME);
EditorGUI.BeginChangeCheck(); EditorGUI.BeginChangeCheck();
isOutlineEnabled = EditorGUILayout.Toggle(kOutline, isOutlineEnabled); isOutlineEnabled = EditorGUILayout.Toggle(kOutline, isOutlineEnabled);
@@ -2444,20 +2358,11 @@ namespace UnityEditor.Rendering.Toon
m_MaterialEditor.RegisterPropertyChangeUndo(kOutline); m_MaterialEditor.RegisterPropertyChangeUndo(kOutline);
if (isOutlineEnabled) if (isOutlineEnabled)
{ {
if (isLegacy) material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, true);
{
material.DisableKeyword(kDisableOutlineKeyword);
}
material.SetShaderPassEnabled(OutlineLightingModeName, true);
} }
else else
{ {
if (isLegacy) material.SetShaderPassEnabled(UtsShaderPassName.OUTLINE_PASS_NAME, false);
{
material.EnableKeyword(kDisableOutlineKeyword);
}
material.SetShaderPassEnabled(OutlineLightingModeName, false);
} }
} }
} }

View File

@@ -1,8 +1,8 @@
{ {
"name": "Unity.Toonshader.Editor", "name": "Misaki.HdrpToon.Editor",
"rootNamespace": "Unity.Toonshader.Editor", "rootNamespace": "Misaki.HdrpToon.Editor",
"references": [ "references": [
"Unity.Toonshader", "Misaki.HdrpToon",
"Unity.RenderPipelines.Core.Runtime", "Unity.RenderPipelines.Core.Runtime",
"Unity.RenderPipelines.Core.Editor", "Unity.RenderPipelines.Core.Editor",
"Unity.RenderPipelines.HighDefinition.Runtime", "Unity.RenderPipelines.HighDefinition.Runtime",

View File

@@ -6,7 +6,7 @@ using UnityEngine;
// Todo: Change this into a editor window // Todo: Change this into a editor window
namespace Unity.Toonshader.Editor namespace Misaki.HdrpToon.Editor
{ {
public class ModelOutlineJobs public class ModelOutlineJobs
{ {

View File

@@ -4,7 +4,7 @@ using UnityEditor.UIElements;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace Unity.Toonshader.Editor namespace Misaki.HdrpToon.Editor
{ {
public class SmoothNormalBakerWindow : EditorWindow public class SmoothNormalBakerWindow : EditorWindow
{ {

View File

@@ -3,14 +3,14 @@ using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.UIElements; using UnityEngine.UIElements;
namespace Unity.Toonshader.Editor namespace Misaki.HdrpToon.Editor
{ {
public class UTSRendererSettingProvider : SettingsProvider public class UTSRendererSettingProvider : SettingsProvider
{ {
class Styles class Styles
{ {
public static GUIContent outline = new GUIContent("Outline Setting"); public static GUIContent outline = new("Outline Setting");
public static GUIContent hairShadow = new GUIContent("Hair Shadow Setting"); public static GUIContent hairShadow = new("Hair Shadow Setting");
} }
private SerializedObject _customSettings; private SerializedObject _customSettings;
@@ -30,12 +30,13 @@ namespace Unity.Toonshader.Editor
EditorGUILayout.PropertyField(_customSettings.FindProperty("outlineSetting"), Styles.outline); EditorGUILayout.PropertyField(_customSettings.FindProperty("outlineSetting"), Styles.outline);
EditorGUILayout.PropertyField(_customSettings.FindProperty("hairShadowSetting"), Styles.hairShadow); EditorGUILayout.PropertyField(_customSettings.FindProperty("hairShadowSetting"), Styles.hairShadow);
_customSettings.ApplyModifiedPropertiesWithoutUndo();
if (EditorGUI.EndChangeCheck()) if (EditorGUI.EndChangeCheck())
{ {
RegisterUTSRenderPass.NotifyRendererSettingChanged(); UTSRenderPassRegistrar.NotifyRendererSettingChanged();
} }
_customSettings.ApplyModifiedPropertiesWithoutUndo();
} }
public static bool IsSettingsAvailable() public static bool IsSettingsAvailable()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 MiB

View File

@@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: 3d00a7a6a88c70c4ca4bb89ca1e3e842
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

8
Runtime/Constants.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6987e5a46707b5240a0ec0d6c7374656
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,13 @@
using UnityEngine.Rendering;
namespace Misaki.HdrpToon
{
public static class UtsShaderPassName
{
public const string OUTLINE_PASS_NAME = "Outline";
public const string HAIR_SHADOW_CASTER_PASS_NAME = "HairShadowCaster";
public static readonly ShaderTagId outlinePassId = new(OUTLINE_PASS_NAME);
public static readonly ShaderTagId hairShadowCasterPassId = new(HAIR_SHADOW_CASTER_PASS_NAME);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 8a2b199311606f54a9585b9b3ea31e7d

View File

@@ -2,24 +2,20 @@ using UnityEngine;
#if UNITY_EDITOR #if UNITY_EDITOR
using UnityEditor; using UnityEditor;
#endif #endif
namespace Unity.Rendering.Toon namespace Misaki.HdrpToon
{ {
[ExecuteAlways] [ExecuteAlways]
[DisallowMultipleComponent] [DisallowMultipleComponent]
[RequireComponent(typeof(Camera))] [RequireComponent(typeof(Camera))]
internal class DebugShadowmap : MonoBehaviour public class DebugShadowmap : MonoBehaviour
{ {
// flags // flags
bool m_initialized = false; bool m_initialized = false;
bool m_srpCallbackInitialized = false; bool m_srpCallbackInitialized = false;
[SerializeField] public bool m_enableShadowmapDebugging = false;
internal bool m_enableShadowmapDebugging = false; public bool m_enableSelfShadowDebugging = false;
[SerializeField] public bool m_enableBinalization = false;
internal bool m_enableSelfShadowDebugging = false; public bool m_enableOutlineDebugging = false;
[SerializeField]
internal bool m_enableBinalization = false;
[SerializeField]
internal bool m_enableOutlineDebugging = false;

View File

@@ -7,12 +7,12 @@ using UnityEditor;
using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering.HighDefinition;
using Unity.Properties; using Unity.Properties;
namespace Unity.Rendering.HighDefinition.Toon namespace Misaki.HdrpToon
{ {
[ExecuteAlways] [ExecuteAlways]
[DisallowMultipleComponent] [DisallowMultipleComponent]
[RequireComponent(typeof(Light))] [RequireComponent(typeof(Light))]
internal class BoxLightAdjustment : MonoBehaviour public class BoxLightAdjustment : MonoBehaviour
{ {
private bool _initialized = false; private bool _initialized = false;
private bool _srpCallbackInitialized = false; private bool _srpCallbackInitialized = false;

View File

@@ -3,19 +3,19 @@ using System.IO;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
namespace Unity.Toonshader namespace Misaki.HdrpToon
{ {
[Serializable] [Serializable]
public struct UTSOutlineSetting internal struct UTSOutlineSetting
{ {
public bool enable; public bool enable;
} }
[Serializable] [Serializable]
public struct UtsHairShadowSetting internal struct UtsHairShadowSetting
{ {
public bool enable; public bool enable;
public RenderingLayerMask CasterRenderingLayer; public UTSHairShadowPass.ShadowQuality shadowQuality;
} }
[CreateAssetMenu(fileName = "UTSRenderSetting", menuName = "UTS/RenderSetting")] [CreateAssetMenu(fileName = "UTSRenderSetting", menuName = "UTS/RenderSetting")]
@@ -25,8 +25,10 @@ namespace Unity.Toonshader
public const string UTS_RENDERING_SETTINGS_PATH = "Assets/Resources/Settings/UTSRenderSettings.asset"; public const string UTS_RENDERING_SETTINGS_PATH = "Assets/Resources/Settings/UTSRenderSettings.asset";
public const string UTS_RENDERING_SETTINGS_RESOURCES_PATH = "Settings/UTSRenderSettings"; public const string UTS_RENDERING_SETTINGS_RESOURCES_PATH = "Settings/UTSRenderSettings";
public UTSOutlineSetting outlineSetting; [SerializeField]
public UtsHairShadowSetting hairShadowSetting; internal UTSOutlineSetting outlineSetting;
[SerializeField]
internal UtsHairShadowSetting hairShadowSetting;
internal static UTSRenderPassSettings GetOrCreateSettings() internal static UTSRenderPassSettings GetOrCreateSettings()
{ {
@@ -43,6 +45,12 @@ namespace Unity.Toonshader
} }
else else
{ {
var directory = Path.GetDirectoryName(UTS_RENDERING_SETTINGS_PATH);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
renderingSettings = CreateInstance<UTSRenderPassSettings>(); renderingSettings = CreateInstance<UTSRenderPassSettings>();
AssetDatabase.CreateAsset(renderingSettings, UTS_RENDERING_SETTINGS_PATH); AssetDatabase.CreateAsset(renderingSettings, UTS_RENDERING_SETTINGS_PATH);
AssetDatabase.Refresh(); AssetDatabase.Refresh();

View File

@@ -317,6 +317,7 @@ Shader "HDRP/Toon"
_SDFNoseHighlightSmoothRange("SDFNoseHighlightSmoothRange", Range(0.0, 0.1)) = 0.02 _SDFNoseHighlightSmoothRange("SDFNoseHighlightSmoothRange", Range(0.0, 0.1)) = 0.02
// Hair Shadow // Hair Shadow
[Toggle(_)] _Is_CastHairShadow("Is_CastHairShadow", Float) = 0
[Toggle(_)] _Is_ReceiveHairShadow("Is_ReceiveHairShadow", Float) = 0 [Toggle(_)] _Is_ReceiveHairShadow("Is_ReceiveHairShadow", Float) = 0
_ShadowBias("ShadowBias", Range(0.0, 5.0)) = 0.0 _ShadowBias("ShadowBias", Range(0.0, 5.0)) = 0.0
@@ -1156,6 +1157,34 @@ Shader "HDRP/Toon"
ENDHLSL ENDHLSL
} }
Pass
{
Name "HairShadowCaster"
Tags{ "LightMode" = "HairShadowCaster" }
Cull[_CullMode]
ZClip [_ZClip]
ZWrite On
ZTest LEqual
ColorMask 0
HLSLPROGRAM
#define SHADERPASS SHADERPASS_SHADOWS
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/ShaderPass/LitDepthPass.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitData.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassDepthOnly.hlsl"
#pragma vertex Vert
#pragma fragment Frag
ENDHLSL
}
} }
SubShader SubShader

View File

@@ -910,7 +910,7 @@ void Frag(PackedVaryingsToPS packedInput,
utsAggregateLighting.directSpecular += _SDFNoseHighlightCoef * SDFNoseHighlight(angle, sdfRes.g, rightside, SDF_UV) * lightColor; utsAggregateLighting.directSpecular += _SDFNoseHighlightCoef * SDFNoseHighlight(angle, sdfRes.g, rightside, SDF_UV) * lightColor;
#endif #endif
#if defined(_RECEIVE_HAIR_SHADOW) && defined(_HAIR_SHADOWS) #ifdef _RECEIVE_HAIR_SHADOW
// Push the face fragment view space position towards the light for a little bit // Push the face fragment view space position towards the light for a little bit
float hairShadowOpacity = saturate(Remap(length(posInput.positionWS), float2(_HairShadowFadeOutDistance, _HairShadowFadeInDistance), float2(0, 1))); float hairShadowOpacity = saturate(Remap(length(posInput.positionWS), float2(_HairShadowFadeOutDistance, _HairShadowFadeInDistance), float2(0, 1)));
@@ -924,8 +924,8 @@ void Frag(PackedVaryingsToPS packedInput,
float2 samplingPoint = (input.positionSS.xy + shadowLength * viewLightDir.xy * (_ScreenSize.xy / float2 (1920.0f, 1080.0f))) * _ScreenSize.zw; // Use 1080p as the reference resolution to achieve consistent shadow lengths across various screen resolutions. float2 samplingPoint = (input.positionSS.xy + shadowLength * viewLightDir.xy * (_ScreenSize.xy / float2 (1920.0f, 1080.0f))) * _ScreenSize.zw; // Use 1080p as the reference resolution to achieve consistent shadow lengths across various screen resolutions.
// Then sample the hair buffer, to see if the fragment lands in shadow. // Then sample the hair buffer, to see if the fragment lands in shadow.
float4 hairBuffer = SAMPLE_TEXTURE2D(_HairShadowTex, s_trilinear_clamp_sampler, samplingPoint); float2 scaledUVs = samplingPoint * _HairShadowRTHandleScale; // We have to including the scaling factor for our shadow map since we are not going to allocate new texture if the rendering resolution changed.
float hairDepth = hairBuffer.r; float hairDepth = SAMPLE_TEXTURE2D(_HairShadowTex, s_trilinear_clamp_sampler, scaledUVs).r;
float depthCorrect = posInput.deviceDepth <= hairDepth + _HairShadowDepthBias ? 1 : 0; // Hair < Face means Hair are closer to camera float depthCorrect = posInput.deviceDepth <= hairDepth + _HairShadowDepthBias ? 1 : 0; // Hair < Face means Hair are closer to camera
// Note that we have LinearEyeDepth in the buffer. A comparison of depth is needed so that we don't project the shadow of hair behind the face. // Note that we have LinearEyeDepth in the buffer. A comparison of depth is needed so that we don't project the shadow of hair behind the face.
float hairShadow = lerp(0,hairShadowOpacity,depthCorrect); float hairShadow = lerp(0,hairShadowOpacity,depthCorrect);

View File

@@ -344,6 +344,8 @@ CBUFFER_END
float _Outline_MaxWidth; float _Outline_MaxWidth;
float4 _HairShadowRTHandleScale;
float _HairShadowDistance; float _HairShadowDistance;
float _HairShadowDistanceScaleFactor; float _HairShadowDistanceScaleFactor;
float _HairShadowDepthBias; float _HairShadowDepthBias;

View File

@@ -1,6 +1,6 @@
using UnityEngine.Rendering; using UnityEngine.Rendering;
namespace Unity.Toonshader namespace Misaki.HdrpToon
{ {
[GenerateHLSL] [GenerateHLSL]
public enum UTS_BSDFDebug public enum UTS_BSDFDebug

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine.Rendering; using UnityEngine.Rendering;
namespace Unity.Toonshader namespace Misaki.HdrpToon
{ {
public static class UTSDebugPanel public static class UTSDebugPanel
{ {

View File

@@ -1,13 +1,22 @@
using Unity.Toonshader; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.Experimental.Rendering; using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering; using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering.RendererUtils; using UnityEngine.Rendering.RendererUtils;
[HideInInspector] namespace Misaki.HdrpToon
public class UTSHairShadowPass : DrawRenderersCustomPass
{ {
[HideInInspector]
internal class UTSHairShadowPass : DrawRenderersCustomPass
{
public enum ShadowQuality
{
Low,
High
}
private const string Hair_Shadow_RTHandle_Scale_Prop_Name = "_HairShadowRTHandleScale";
private const string Hair_Shadow_Distance_Prop_Name = "_HairShadowDistance"; private const string Hair_Shadow_Distance_Prop_Name = "_HairShadowDistance";
private const string Hair_Shadow_Distance_Scale_Prop_Name = "_HairShadowDistanceScaleFactor"; private const string Hair_Shadow_Distance_Scale_Prop_Name = "_HairShadowDistanceScaleFactor";
private const string Hair_Shadow_Depth_Bias_Prop_Name = "_HairShadowDepthBias"; private const string Hair_Shadow_Depth_Bias_Prop_Name = "_HairShadowDepthBias";
@@ -17,38 +26,80 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
private const string Output_RT_Name = "_HairShadowTex"; private const string Output_RT_Name = "_HairShadowTex";
private RTHandle _outputRTHandle; private RTHandle _outputRTHandle;
private bool _isEnable = false; private bool _needReallocate;
public UnityEngine.RenderingLayerMask renderingLayerMask; private ShadowQuality _shadowQuality = ShadowQuality.High;
internal ShadowQuality CurrentShadowQuality
{
get => _shadowQuality;
set
{
if (_shadowQuality == value)
{
return;
}
_shadowQuality = value;
_needReallocate = true;
}
}
private bool ShouldReallocateBuffer()
{
return _outputRTHandle == null || _outputRTHandle.rt == null || !_outputRTHandle.rt.IsCreated() || _needReallocate;
}
private void ReallocateBuffer()
{
#if UNITY_EDITOR
if (EditorApplication.isCompiling)
{
return;
}
#endif
var scale = _shadowQuality switch
{
ShadowQuality.Low => new Vector2(0.5f, 0.5f),
ShadowQuality.High => Vector2.one,
_ => Vector2.zero
};
var format = _shadowQuality switch
{
ShadowQuality.Low => GraphicsFormat.D16_UNorm,
ShadowQuality.High => GraphicsFormat.D32_SFloat,
_ => GraphicsFormat.D16_UNorm
};
_outputRTHandle?.Release();
_outputRTHandle = RTHandles.Alloc(scale, colorFormat: format, filterMode: FilterMode.Bilinear, wrapMode: TextureWrapMode.Clamp, isShadowMap: true, name: Output_RT_Name);
Shader.SetGlobalTexture(Output_RT_Name, _outputRTHandle);
_needReallocate = false;
}
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{ {
_outputRTHandle?.Release(); ReallocateBuffer();
_outputRTHandle = RTHandles.Alloc(Screen.width, Screen.height, colorFormat: GraphicsFormat.D32_SFloat, filterMode: FilterMode.Bilinear, wrapMode: TextureWrapMode.Clamp, isShadowMap: true, name: Output_RT_Name);
SetEnable(true);
} }
protected override void Execute(CustomPassContext ctx) protected override void Execute(CustomPassContext ctx)
{ {
var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>(); if (ShouldReallocateBuffer())
if (utsRenderer == null || !utsRenderer.enableHairShadow.value || !utsRenderer.enable.value)
{ {
SetEnable(false); ReallocateBuffer();
return; return;
} }
if (!_isEnable)
{
return;
}
SetShadowProperty(utsRenderer);
if (_outputRTHandle != null)
{
Shader.SetGlobalTexture(Output_RT_Name, _outputRTHandle);
CoreUtils.SetRenderTarget(ctx.cmd, _outputRTHandle, ClearFlag.DepthStencil); CoreUtils.SetRenderTarget(ctx.cmd, _outputRTHandle, ClearFlag.DepthStencil);
var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>();
var shouldRender = utsRenderer != null && utsRenderer.enableHairShadow.value && utsRenderer.state.value;
if (!shouldRender)
{
CoreUtils.ClearRenderTarget(ctx.cmd, ClearFlag.DepthStencil, Color.black);
return;
} }
var mask = RenderStateMask.Nothing; var mask = RenderStateMask.Nothing;
@@ -57,20 +108,17 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
depthState = new DepthState(true, CompareFunction.LessEqual), depthState = new DepthState(true, CompareFunction.LessEqual),
}; };
var result = new RendererListDesc(HDShaderPassNames.s_DepthForwardOnlyName, ctx.cullingResults, ctx.hdCamera.camera) var result = new RendererListDesc(UtsShaderPassName.hairShadowCasterPassId, ctx.cullingResults, ctx.hdCamera.camera)
{ {
renderQueueRange = GetRenderQueueRange(RenderQueueType.All), renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
sortingCriteria = SortingCriteria.CommonOpaque, sortingCriteria = SortingCriteria.CommonOpaque,
excludeObjectMotionVectors = false, excludeObjectMotionVectors = false,
stateBlock = stateBlock, stateBlock = stateBlock,
renderingLayerMask = renderingLayerMask,
}; };
CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result)); CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));
}
private static void SetShadowProperty(UTSRenderer utsRenderer) Shader.SetGlobalVector(Hair_Shadow_RTHandle_Scale_Prop_Name, _outputRTHandle.rtHandleProperties.rtHandleScale);
{
Shader.SetGlobalFloat(Hair_Shadow_Distance_Prop_Name, utsRenderer.shadowDistance.value); Shader.SetGlobalFloat(Hair_Shadow_Distance_Prop_Name, utsRenderer.shadowDistance.value);
Shader.SetGlobalFloat(Hair_Shadow_Distance_Scale_Prop_Name, utsRenderer.shadowDistanceScale.value); Shader.SetGlobalFloat(Hair_Shadow_Distance_Scale_Prop_Name, utsRenderer.shadowDistanceScale.value);
Shader.SetGlobalFloat(Hair_Shadow_Depth_Bias_Prop_Name, utsRenderer.shadowDepthBias.value); Shader.SetGlobalFloat(Hair_Shadow_Depth_Bias_Prop_Name, utsRenderer.shadowDepthBias.value);
@@ -85,24 +133,13 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
public void Release() public void Release()
{ {
SetEnable(false); #if UNITY_EDITOR
if (EditorApplication.isCompiling)
{
return;
}
#endif
_outputRTHandle?.Release(); _outputRTHandle?.Release();
} }
public void SetEnable(bool isEnable)
{
if (_isEnable != isEnable)
{
if (isEnable)
{
Shader.EnableKeyword("_HAIR_SHADOWS");
}
else
{
Shader.DisableKeyword("_HAIR_SHADOWS");
}
_isEnable = isEnable;
}
} }
} }

View File

@@ -1,21 +1,24 @@
using Unity.Toonshader;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering; using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering.HighDefinition;
[HideInInspector] namespace Misaki.HdrpToon
public class UTSOutlinePass : DrawRenderersCustomPass
{ {
private ShaderTagId outlineTag = new("Outline"); [HideInInspector]
internal class UTSOutlinePass : DrawRenderersCustomPass
{
protected override void Execute(CustomPassContext ctx) protected override void Execute(CustomPassContext ctx)
{ {
var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>(); var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>();
if (utsRenderer == null) if (utsRenderer == null)
{
return; return;
}
if (!utsRenderer.enableOutline.value || !utsRenderer.enable.value) if (!utsRenderer.enableOutline.value || !utsRenderer.state.value)
{
return; return;
}
Shader.SetGlobalFloat("_Outline_MaxWidth", utsRenderer.outlineMaxWidth.value * 0.01f); Shader.SetGlobalFloat("_Outline_MaxWidth", utsRenderer.outlineMaxWidth.value * 0.01f);
@@ -28,7 +31,7 @@ public class UTSOutlinePass : DrawRenderersCustomPass
}; };
var renderConfig = HDUtils.GetRendererConfiguration(false, false); var renderConfig = HDUtils.GetRendererConfiguration(false, false);
var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(outlineTag, ctx.cullingResults, ctx.hdCamera.camera) var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(UtsShaderPassName.outlinePassId, ctx.cullingResults, ctx.hdCamera.camera)
{ {
rendererConfiguration = renderConfig, rendererConfiguration = renderConfig,
renderQueueRange = GetRenderQueueRange(RenderQueueType.All), renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
@@ -38,4 +41,5 @@ public class UTSOutlinePass : DrawRenderersCustomPass
CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result)); CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));
} }
}
} }

View File

@@ -0,0 +1,91 @@
using System;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
namespace Misaki.HdrpToon
{
internal class UTSPass : CustomPass
{
private const int Adjustment_Curve_Precision = 128;
private const string Compensation_Prop_Name = "_ToonEvAdjustmentCompensation";
private const string Exposure_Adjustment_Prop_Name = "_ToonEvAdjustmentCurve";
private const string Exposure_Array_Prop_Name = "_ToonEvAdjustmentValueArray";
private const string Exposure_Min_Prop_Name = "_ToonEvAdjustmentValueMin";
private const string Exposure_Max_Prop_Name = "_ToonEvAdjustmentValueMax";
private const string Toon_Light_Filter_Prop_Name = "_ToonLightHiCutFilter";
private const string Ignore_Volume_Exposure_Prop_Name = "_ToonIgnoreExposureMultiplier";
private float _max;
private float _min;
private float[] _exposureArray;
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{
_exposureArray = new float[Adjustment_Curve_Precision];
}
protected override void Execute(CustomPassContext ctx)
{
var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>();
if (utsRenderer == null)
{
return;
}
var toonEVAdjustment = utsRenderer.toonEVAdjustment.value ? 1 : 0;
var lightIntensityLimiter = utsRenderer.lightIntensityLimiter.value ? 1 : 0;
var ignoreVolumeExposure = utsRenderer.ignoreVolumeExposure.value ? 1 : 0;
var compensation = utsRenderer.compensation.value;
if (!utsRenderer.state.value)
{
_min = 0;
_max = 0;
_exposureArray.AsSpan().Fill(0);
toonEVAdjustment = 0;
lightIntensityLimiter = 0;
ignoreVolumeExposure = 0;
compensation = 0;
}
else
{
// Fail safe in case the curve is deleted / has 0 point
var curve = utsRenderer.adjustmentCurve.value;
if (curve == null || curve.length == 0)
{
_min = 0f;
_max = 0f;
_exposureArray.AsSpan().Fill(0);
}
else
{
_min = curve[0].time;
_max = curve[curve.length - 1].time;
var step = (_max - _min) / (Adjustment_Curve_Precision - 1f);
for (var i = 0; i < Adjustment_Curve_Precision; i++)
{
_exposureArray[i] = curve.Evaluate(_min + step * i);
}
}
}
Shader.SetGlobalFloatArray(Exposure_Array_Prop_Name, _exposureArray);
Shader.SetGlobalFloat(Exposure_Min_Prop_Name, _min);
Shader.SetGlobalFloat(Exposure_Max_Prop_Name, _max);
Shader.SetGlobalInt(Exposure_Adjustment_Prop_Name, toonEVAdjustment);
Shader.SetGlobalInt(Toon_Light_Filter_Prop_Name, lightIntensityLimiter);
Shader.SetGlobalInt(Ignore_Volume_Exposure_Prop_Name, ignoreVolumeExposure);
Shader.SetGlobalFloat(Compensation_Prop_Name, compensation);
}
protected override void Cleanup()
{
_exposureArray = null;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: be0dbffe58fd1fc48a45d8a6e1791ac0

View File

@@ -1,19 +1,23 @@
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering.HighDefinition;
namespace Unity.Toonshader namespace Misaki.HdrpToon
{ {
#if UNITY_EDITOR #if UNITY_EDITOR
[UnityEditor.InitializeOnLoad] [UnityEditor.InitializeOnLoad]
#endif #endif
public static class RegisterUTSRenderPass public static class UTSRenderPassRegistrar
{ {
private static readonly UTSRenderPassSettings _renderSetting; private static UTSRenderPassSettings _renderSetting;
private static readonly UTSOutlinePass _outlinePass; private static UTSPass _utsPass;
private static readonly UTSHairShadowPass _hairShadowPass; private static UTSHairShadowPass _hairShadowPass;
private static UTSOutlinePass _outlinePass;
static RegisterUTSRenderPass() static UTSRenderPassRegistrar() => RegisterCustomPasses();
[RuntimeInitializeOnLoadMethod]
public static void RegisterCustomPasses()
{ {
_renderSetting = UTSRenderPassSettings.GetOrCreateSettings(); _renderSetting = UTSRenderPassSettings.GetOrCreateSettings();
if (_renderSetting == null) if (_renderSetting == null)
@@ -21,43 +25,54 @@ namespace Unity.Toonshader
return; return;
} }
_outlinePass = new() _utsPass = new UTSPass()
{ {
name = "UTS Outline", name = "UTS Pass",
targetColorBuffer = CustomPass.TargetBuffer.None,
targetDepthBuffer = CustomPass.TargetBuffer.None,
}; };
_hairShadowPass = new() _hairShadowPass = new()
{ {
name = "UTS Hair Shadow Map", name = "UTS Hair Shadow Map",
renderingLayerMask = _renderSetting.hairShadowSetting.CasterRenderingLayer,
targetColorBuffer = CustomPass.TargetBuffer.None, targetColorBuffer = CustomPass.TargetBuffer.None,
targetDepthBuffer = CustomPass.TargetBuffer.None, targetDepthBuffer = CustomPass.TargetBuffer.None,
}; };
RegisterCustomPasses(); _outlinePass = new()
}
[RuntimeInitializeOnLoadMethod]
public static void RegisterCustomPasses()
{ {
name = "UTS Outline",
targetColorBuffer = CustomPass.TargetBuffer.None,
targetDepthBuffer = CustomPass.TargetBuffer.None,
};
CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.BeforeRendering, _utsPass);
CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.AfterOpaqueDepthAndNormal, _hairShadowPass); CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.AfterOpaqueDepthAndNormal, _hairShadowPass);
CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.BeforePostProcess, _outlinePass); CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.BeforePostProcess, _outlinePass);
_hairShadowPass.SetEnable(_renderSetting.hairShadowSetting.enable); NotifyRendererSettingChanged();
_outlinePass.enabled = _renderSetting.outlineSetting.enable;
} }
public static void UnregisterGlobalCustomPass() public static void UnregisterGlobalCustomPass()
{ {
CustomPassVolume.UnregisterGlobalCustomPass(_utsPass);
CustomPassVolume.UnregisterGlobalCustomPass(_hairShadowPass); CustomPassVolume.UnregisterGlobalCustomPass(_hairShadowPass);
CustomPassVolume.UnregisterGlobalCustomPass(_outlinePass); CustomPassVolume.UnregisterGlobalCustomPass(_outlinePass);
_hairShadowPass.Release();
} }
public static void NotifyRendererSettingChanged() public static void NotifyRendererSettingChanged()
{ {
_hairShadowPass.SetEnable(_renderSetting.hairShadowSetting.enable); if (_hairShadowPass == null || _outlinePass == null)
_hairShadowPass.renderingLayerMask = _renderSetting.hairShadowSetting.CasterRenderingLayer; {
return;
}
_hairShadowPass.enabled = _renderSetting.hairShadowSetting.enable;
_hairShadowPass.CurrentShadowQuality = _renderSetting.hairShadowSetting.shadowQuality;
if (!_renderSetting.hairShadowSetting.enable)
{
_hairShadowPass.Release();
}
_outlinePass.enabled = _renderSetting.outlineSetting.enable; _outlinePass.enabled = _renderSetting.outlineSetting.enable;
} }

View File

@@ -1,198 +1,39 @@
using System; using System;
using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering; using UnityEngine.Rendering;
namespace Unity.Toonshader namespace Misaki.HdrpToon
{ {
[Serializable, VolumeComponentMenu("Rendering/Unity Toon Shader")] [Serializable, VolumeComponentMenu("Rendering/UTS Renderer")]
public class UTSRenderer : VolumeComponent public class UTSRenderer : VolumeComponent
{ {
// flags public BoolParameter state = new(false, BoolParameter.DisplayType.EnumPopup);
bool _initialized = false;
const int kAdjustmentCurvePrecision = 128;
const string kCompensationPropName = "_ToonEvAdjustmentCompensation";
const string kExposureAdjustmentPropName = "_ToonEvAdjustmentCurve";
const string kExposureArrayPropName = "_ToonEvAdjustmentValueArray";
const string kExposureMinPropName = "_ToonEvAdjustmentValueMin";
const string kExposureMaxPropName = "_ToonEvAdjustmentValueMax";
const string kToonLightFilterPropName = "_ToonLightHiCutFilter";
const string kIgnoreVolumeExposurePropName = "_ToonIgnoreExposureMultiplier";
[SerializeField]
internal float[] _ExposureArray;
[SerializeField]
internal float _Max, _Min;
//CustomPassVolume customPassVolume = new();
//UTSOutlinePass outlinePass = new();
#if UNITY_EDITOR
#pragma warning restore CS0414
bool m_isCompiling = false;
#endif
public BoolParameter enable = new BoolParameter(false, BoolParameter.DisplayType.EnumPopup);
[Space] [Space]
[Header("Outline")] [Header("Outline")]
public BoolParameter enableOutline = new BoolParameter(false); public BoolParameter enableOutline = new(false);
public MinFloatParameter outlineMaxWidth = new MinFloatParameter(1.0f, 0.0f); public MinFloatParameter outlineMaxWidth = new(1.0f, 0.0f);
[Space] [Space]
[Header("Hair Shadow")] [Header("Hair Shadow")]
public BoolParameter enableHairShadow = new BoolParameter(false); public BoolParameter enableHairShadow = new(false);
public ClampedFloatParameter shadowDistance = new ClampedFloatParameter(5.0f, 0.0f, 20.0f); public ClampedFloatParameter shadowDistance = new(5.0f, 0.0f, 20.0f);
public ClampedFloatParameter shadowDistanceScale = new ClampedFloatParameter(0.5f, 0.0f, 1.0f); public ClampedFloatParameter shadowDistanceScale = new(0.5f, 0.0f, 1.0f);
public ClampedFloatParameter shadowDepthBias = new ClampedFloatParameter(0f, 0.0f, 0.01f); public ClampedFloatParameter shadowDepthBias = new(0f, 0.0f, 0.01f);
public FloatParameter shadowFadeIn = new FloatParameter(45f); public FloatParameter shadowFadeIn = new(45f);
public FloatParameter shadowFadeOut = new FloatParameter(50f); public FloatParameter shadowFadeOut = new(50f);
[Space] [Space]
[Header("Exposure")] [Header("Exposure")]
public BoolParameter ignoreVolumeExposure = new BoolParameter(false); public BoolParameter ignoreVolumeExposure = new(false);
public BoolParameter lightIntensityLimiter = new BoolParameter(false); public BoolParameter lightIntensityLimiter = new(false);
public MinFloatParameter compensation = new MinFloatParameter(0.0f, 0.0f); public MinFloatParameter compensation = new(0.0f, 0.0f);
public BoolParameter toonEVAdjustment = new BoolParameter(false); public BoolParameter toonEVAdjustment = new(false);
public AnimationCurveParameter adjustmentCurve = new AnimationCurveParameter(DefaultAnimationCurve()); public AnimationCurveParameter adjustmentCurve = new(DefaultAnimationCurve());
UTSRenderer() private static AnimationCurve DefaultAnimationCurve()
{
displayName = "UTS Renderer";
}
protected override void OnEnable()
{
base.OnEnable();
UTSDebugPanel.OnEnable();
Initialize();
}
protected override void OnDisable()
{
base.OnDisable();
UTSDebugPanel.OnDisable();
Release();
}
private void OnValidate()
{
if (!enable.value)
{
Release();
return;
}
Initialize();
if (!_initialized)
{
return;
}
// Fail safe in case the curve is deleted / has 0 point
var curve = adjustmentCurve.value;
if (curve == null || curve.length == 0)
{
_Min = 0f;
_Max = 0f;
for (var i = 0; i < kAdjustmentCurvePrecision; i++)
_ExposureArray[i] = 0.0f;
}
else
{
_Min = curve[0].time;
_Max = curve[curve.length - 1].time;
var step = (_Max - _Min) / (kAdjustmentCurvePrecision - 1f);
for (var i = 0; i < kAdjustmentCurvePrecision; i++)
_ExposureArray[i] = curve.Evaluate(_Min + step * i);
}
#if UNITY_EDITOR
// handle script recompile
if (EditorApplication.isCompiling && !m_isCompiling)
{
// on compile begin
m_isCompiling = true;
// Release(); no need
return; //
}
else if (!EditorApplication.isCompiling && m_isCompiling)
{
// on compile end
m_isCompiling = false;
}
#endif
Shader.SetGlobalFloatArray(kExposureArrayPropName, _ExposureArray);
Shader.SetGlobalFloat(kExposureMinPropName, _Min);
Shader.SetGlobalFloat(kExposureMaxPropName, _Max);
Shader.SetGlobalInt(kExposureAdjustmentPropName, toonEVAdjustment.value ? 1 : 0);
Shader.SetGlobalInt(kToonLightFilterPropName, lightIntensityLimiter.value ? 1 : 0);
Shader.SetGlobalInt(kIgnoreVolumeExposurePropName, ignoreVolumeExposure.value ? 1 : 0);
Shader.SetGlobalFloat(kCompensationPropName, compensation.value);
}
internal static AnimationCurve DefaultAnimationCurve()
{ {
return AnimationCurve.Linear(-10f, -10f, -1.32f, -1.32f); return AnimationCurve.Linear(-10f, -10f, -1.32f, -1.32f);
} }
void Initialize()
{
if (_initialized)
{
return;
}
#if UNITY_EDITOR
// initializing renderer can interfere GI baking. so wait until it is completed.
if (EditorApplication.isCompiling)
return;
#endif
if (_ExposureArray == null || _ExposureArray.Length != kAdjustmentCurvePrecision)
{
_ExposureArray = new float[kAdjustmentCurvePrecision];
}
_initialized = true;
}
protected override void OnDestroy()
{
base.OnDestroy();
Release();
}
new void Release()
{
if (_initialized)
{
_ExposureArray = null;
Shader.SetGlobalFloat(kExposureMinPropName, 0);
Shader.SetGlobalFloat(kExposureMaxPropName, 0);
Shader.SetGlobalInt(kExposureAdjustmentPropName, 0);
Shader.SetGlobalInt(kToonLightFilterPropName, 0);
Shader.SetGlobalInt(kIgnoreVolumeExposurePropName, 0);
Shader.SetGlobalFloat(kCompensationPropName, 0);
}
_initialized = false;
base.Release();
}
private void Reset()
{
OnDisable();
OnEnable();
DefaultAnimationCurve();
}
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "Unity.Toonshader", "name": "Misaki.HdrpToon",
"rootNamespace": "Unity.Toonshader", "rootNamespace": "Misaki.HdrpToon",
"references": [ "references": [
"GUID:df380645f10b7bc4b97d4f5eb6303d95", "GUID:df380645f10b7bc4b97d4f5eb6303d95",
"GUID:3eae0364be2026648bf74846acb8a731", "GUID:3eae0364be2026648bf74846acb8a731",

View File

@@ -1,22 +1,15 @@
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
#if UNITY_EDITOR #if UNITY_EDITOR
using UnityEditor; using UnityEditor;
#endif #endif
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;
using UnityObject = UnityEngine.Object;
using System.Linq; using System.Linq;
namespace Unity.Rendering.Toon namespace Misaki.HdrpToon
{ {
[ExecuteAlways] [ExecuteAlways]
[DisallowMultipleComponent] [DisallowMultipleComponent]
[UTSHelpURL("ToonEVAdjustment")] public class ModelToonEvAdjustment : MonoBehaviour
internal class ModelToonEvAdjustment : MonoBehaviour
{ {
const string kCompensationPorpName = "_ToonEvAdjustmentCompensation"; const string kCompensationPorpName = "_ToonEvAdjustmentCompensation";
const string kExposureAdjustmentPropName = "_ToonEvAdjustmentCurve"; const string kExposureAdjustmentPropName = "_ToonEvAdjustmentCurve";
@@ -31,30 +24,20 @@ namespace Unity.Rendering.Toon
const int kAdjustmentCurvePrecision = 128; const int kAdjustmentCurvePrecision = 128;
public bool m_ToonLightHiCutFilter = false;
public bool m_ExposureAdjustmnt = false;
public bool m_IgnorVolumeExposure = false;
[SerializeField] public AnimationCurve m_AnimationCurve = DefaultAnimationCurve();
internal bool m_ToonLightHiCutFilter = false; public float[] m_ExposureArray;
[SerializeField] public float m_Max, m_Min;
internal bool m_ExposureAdjustmnt = false; public float m_Compensation;
[SerializeField]
internal bool m_IgnorVolumeExposure = false;
[SerializeField]
internal AnimationCurve m_AnimationCurve = DefaultAnimationCurve();
[SerializeField]
internal float[] m_ExposureArray;
[SerializeField]
internal float m_Max, m_Min;
[SerializeField]
internal float m_Compensation;
internal GameObject[] m_Objs; internal GameObject[] m_Objs;
[SerializeField] [SerializeField]
// [HideInInspector] // [HideInInspector]
Renderer[] m_Renderers; Renderer[] m_Renderers;
[SerializeField] [SerializeField]
// [HideInInspector] // [HideInInspector]
MaterialPropertyBlock[] m_MaterialPropertyBlocks; MaterialPropertyBlock[] m_MaterialPropertyBlocks;
#if UNITY_EDITOR #if UNITY_EDITOR
@@ -111,16 +94,16 @@ namespace Unity.Rendering.Toon
m_Min = 0f; m_Min = 0f;
m_Max = 0f; m_Max = 0f;
for (int i = 0; i < kAdjustmentCurvePrecision; i++) for (var i = 0; i < kAdjustmentCurvePrecision; i++)
m_ExposureArray[i] = 0.0f; m_ExposureArray[i] = 0.0f;
} }
else else
{ {
m_Min = curve[0].time; m_Min = curve[0].time;
m_Max = curve[curve.length - 1].time; m_Max = curve[curve.length - 1].time;
float step = (m_Max - m_Min) / (kAdjustmentCurvePrecision - 1f); var step = (m_Max - m_Min) / (kAdjustmentCurvePrecision - 1f);
for (int i = 0; i < kAdjustmentCurvePrecision; i++) for (var i = 0; i < kAdjustmentCurvePrecision; i++)
m_ExposureArray[i] = curve.Evaluate(m_Min + step * i); m_ExposureArray[i] = curve.Evaluate(m_Min + step * i);
} }
@@ -143,8 +126,8 @@ namespace Unity.Rendering.Toon
int length = m_Renderers.Length; var length = m_Renderers.Length;
for (int ii = 0; ii < length; ii++) for (var ii = 0; ii < length; ii++)
{ {
m_Renderers[ii].GetPropertyBlock(m_MaterialPropertyBlocks[ii]); m_Renderers[ii].GetPropertyBlock(m_MaterialPropertyBlocks[ii]);
@@ -209,13 +192,13 @@ namespace Unity.Rendering.Toon
m_Objs = new GameObject[1]; m_Objs = new GameObject[1];
m_Objs[0] = this.gameObject; m_Objs[0] = this.gameObject;
} }
int objCount = m_Objs.Length; var objCount = m_Objs.Length;
int rendererCount = 0; var rendererCount = 0;
List<Renderer> rendererList = new List<Renderer>(); var rendererList = new List<Renderer>();
for (int ii = 0; ii < objCount; ii++) for (var ii = 0; ii < objCount; ii++)
{ {
if (m_Objs[ii] == null ) if (m_Objs[ii] == null)
{ {
continue; continue;
} }
@@ -227,20 +210,20 @@ namespace Unity.Rendering.Toon
rendererCount++; rendererCount++;
rendererList.Add(renderer); rendererList.Add(renderer);
} }
GameObject[] childGameObjects = m_Objs[ii].GetComponentsInChildren<Transform>().Select(t => t.gameObject).ToArray(); var childGameObjects = m_Objs[ii].GetComponentsInChildren<Transform>().Select(t => t.gameObject).ToArray();
int childCount = childGameObjects.Length; var childCount = childGameObjects.Length;
for (int jj = 0; jj < childCount; jj++) for (var jj = 0; jj < childCount; jj++)
{ {
if (m_Objs[ii] == childGameObjects[jj]) if (m_Objs[ii] == childGameObjects[jj])
continue; continue;
var modelToonEvAdjustment = childGameObjects[jj].GetComponent<ModelToonEvAdjustment>(); var modelToonEvAdjustment = childGameObjects[jj].GetComponent<ModelToonEvAdjustment>();
if ( modelToonEvAdjustment != null ) if (modelToonEvAdjustment != null)
{ {
break; break;
} }
renderer = childGameObjects[jj].GetComponent<Renderer>(); renderer = childGameObjects[jj].GetComponent<Renderer>();
if ( renderer != null ) if (renderer != null)
{ {
rendererList.Add(renderer); rendererList.Add(renderer);
rendererCount++; rendererCount++;
@@ -254,7 +237,7 @@ namespace Unity.Rendering.Toon
m_Renderers = rendererList.ToArray(); m_Renderers = rendererList.ToArray();
for (int ii = 0; ii < rendererCount; ii++) for (var ii = 0; ii < rendererCount; ii++)
{ {
m_MaterialPropertyBlocks[ii] = new MaterialPropertyBlock(); m_MaterialPropertyBlocks[ii] = new MaterialPropertyBlock();
} }
@@ -272,10 +255,10 @@ namespace Unity.Rendering.Toon
if (m_initialized) if (m_initialized)
{ {
m_ExposureArray = null; m_ExposureArray = null;
if (m_Renderers != null ) if (m_Renderers != null)
{ {
int length = m_Renderers.Length; var length = m_Renderers.Length;
for (int ii = 0; ii < length; ii++) for (var ii = 0; ii < length; ii++)
{ {
m_Renderers[ii].SetPropertyBlock(null); m_Renderers[ii].SetPropertyBlock(null);
} }

View File

@@ -2,15 +2,14 @@ using UnityEngine;
#if UNITY_EDITOR #if UNITY_EDITOR
using UnityEditor; using UnityEditor;
#endif #endif
namespace Unity.Rendering.Toon
namespace Misaki.HdrpToon
{ {
[ExecuteAlways] [ExecuteAlways]
[DisallowMultipleComponent] [DisallowMultipleComponent]
[UTSHelpURL("ToonEVAdjustment")] [UTSHelpURL("ToonEVAdjustment")]
internal class SceneToonEvAdjustment : MonoBehaviour public class SceneToonEvAdjustment : MonoBehaviour
{ {
// flags // flags
bool m_initialized = false; bool m_initialized = false;
@@ -69,10 +68,11 @@ namespace Unity.Rendering.Toon
DefaultAnimationCurve(); DefaultAnimationCurve();
} }
internal static AnimationCurve DefaultAnimationCurve() public static AnimationCurve DefaultAnimationCurve()
{ {
return AnimationCurve.Linear(-10f, -10f, -1.32f, -1.32f); return AnimationCurve.Linear(-10f, -10f, -1.32f, -1.32f);
} }
void Update() void Update()
{ {
@@ -82,7 +82,7 @@ namespace Unity.Rendering.Toon
// Fail safe in case the curve is deleted / has 0 point // Fail safe in case the curve is deleted / has 0 point
AnimationCurve curve = m_AnimationCurve; var curve = m_AnimationCurve;
if (curve == null || curve.length == 0) if (curve == null || curve.length == 0)
@@ -90,16 +90,16 @@ namespace Unity.Rendering.Toon
m_Min = 0f; m_Min = 0f;
m_Max = 0f; m_Max = 0f;
for (int i = 0; i < kAdjustmentCurvePrecision; i++) for (var i = 0; i < kAdjustmentCurvePrecision; i++)
m_ExposureArray[i] = 0.0f; m_ExposureArray[i] = 0.0f;
} }
else else
{ {
m_Min = curve[0].time; m_Min = curve[0].time;
m_Max = curve[curve.length - 1].time; m_Max = curve[curve.length - 1].time;
float step = (m_Max - m_Min) / (kAdjustmentCurvePrecision - 1f); var step = (m_Max - m_Min) / (kAdjustmentCurvePrecision - 1f);
for (int i = 0; i < kAdjustmentCurvePrecision; i++) for (var i = 0; i < kAdjustmentCurvePrecision; i++)
m_ExposureArray[i] = curve.Evaluate(m_Min + step * i); m_ExposureArray[i] = curve.Evaluate(m_Min + step * i);
} }

View File

@@ -1,13 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
#if UNITY_EDITOR #if UNITY_EDITOR
using UnityEditor;
#endif #endif
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering; namespace Misaki.HdrpToon
using UnityObject = UnityEngine.Object;
namespace Unity.Rendering.Toon
{ {
#if UNITY_2021_1_OR_NEWER #if UNITY_2021_1_OR_NEWER
internal class UTSHelpURLAttribute : HelpURLAttribute internal class UTSHelpURLAttribute : HelpURLAttribute

View File

@@ -1,6 +1,6 @@
{ {
"name": "com.misaki.hdrp-toon", "name": "com.misaki.hdrp-toon",
"version": "2.0.4", "version": "2.0.5",
"displayName": "HDRP Toon", "displayName": "HDRP Toon",
"description": "A high quality toon shader for High Definition Render Pipeline(HDRP)", "description": "A high quality toon shader for High Definition Render Pipeline(HDRP)",
"changelogUrl": "https://git.personalnas.com/Misaki/hdrp-toon/src/branch/develop/CHANGELOG.md", "changelogUrl": "https://git.personalnas.com/Misaki/hdrp-toon/src/branch/develop/CHANGELOG.md",