4 Commits

Author SHA1 Message Date
Misaki
60631f558f Removed the dependency of RenderingLayerMask in UTSOutlinePass; 2024-11-20 17:01:24 +09:00
Misaki
52469649de Fixed the bug from shader gui drawer : [Worker0] Failed to create MaterialEnum, enum UnityEditor.Rendering.HighDefinition.TransparentCullMode not found;
Fixed the bug that outline does not rendering when material type is set to transparent;
Fixed the bug that hair shadow buffer does not rendering the object that material type is set to transparent;
2024-11-19 00:26:28 +09:00
Misaki
1b47306585 Changed the defualt UTS rendering settings location; 2024-11-18 23:53:13 +09:00
Misaki
bd7804395d Updated changed log 2024-11-18 23:16:18 +09:00
17 changed files with 214 additions and 392 deletions

30
CHANGELOG.md Normal file
View File

@@ -0,0 +1,30 @@
# Changelog
All notable changes to this project will be documented in this file.
## [2.0.1] - 11-Nov-2024
### Added
- Added custom editor for BoxLightAdjustment;
### Changed
- Changed the outline layer and hair shadow caster layer from LayerMask to RenderingLayerMask;
- Changed the RenderingLayerMask update from every frame to when property changed;
- Chnaged the light following calculation from Update to LateUpdate;
---
## [2.0.0] - 23-Oct-2024
### Added
- Added the support of HDRP 17;
### Changed
- Changed GameObject custom pass to global custom pass;
### Fixed
- Fixed dependency problem in package.json file;
### Removed
- Removed HairShaodwPassDrawer;
- Removed UTSOutLinePassDrawer;

View File

@@ -1,7 +1,6 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: b8d9ae1381ecb2141b4a741976d1c827 guid: f6d3b51789082774690f2051bbca2438
folderAsset: yes TextScriptImporter:
DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: assetBundleName:

View File

@@ -18,8 +18,6 @@ namespace Unity.Toonshader.Editor
return base.CreateInspectorGUI(); return base.CreateInspectorGUI();
} }
var boxLightAdjustment = (BoxLightAdjustment)target;
var root = new VisualElement var root = new VisualElement
{ {
dataSource = target dataSource = target

View File

@@ -1646,34 +1646,34 @@ namespace UnityEditor.Rendering.Toon
switch (m_shadowMode) switch (m_shadowMode)
{ {
case ShadowMode.Normal: case ShadowMode.Normal:
{ {
material.SetFloat(ShaderPropShadowMode, (int)ShadowMode.Normal); material.SetFloat(ShaderPropShadowMode, (int)ShadowMode.Normal);
material.DisableKeyword(new LocalKeyword(material.shader, "_SDFShadow")); material.DisableKeyword(new LocalKeyword(material.shader, "_SDFShadow"));
GUI_RangeProperty(material, Styles.shaderProp1st_ShadeColor_StepText); GUI_RangeProperty(material, Styles.shaderProp1st_ShadeColor_StepText);
GUI_RangeProperty(material, Styles.shaderProp1st_ShadeColor_FeatherText); GUI_RangeProperty(material, Styles.shaderProp1st_ShadeColor_FeatherText);
GUI_RangeProperty(material, Styles.shaderProp2nd_ShadeColor_StepText); GUI_RangeProperty(material, Styles.shaderProp2nd_ShadeColor_StepText);
GUI_RangeProperty(material, Styles.shaderProp2nd_ShadeColor_FeatherText); GUI_RangeProperty(material, Styles.shaderProp2nd_ShadeColor_FeatherText);
//Share variables with DoubleWithFeather method. //Share variables with DoubleWithFeather method.
material.SetFloat(ShaderPropBaseColor_Step, material.GetFloat(ShaderProp1st_ShadeColor_Step)); material.SetFloat(ShaderPropBaseColor_Step, material.GetFloat(ShaderProp1st_ShadeColor_Step));
material.SetFloat(ShaderPropBaseShade_Feather, material.GetFloat(ShaderProp1st_ShadeColor_Feather)); material.SetFloat(ShaderPropBaseShade_Feather, material.GetFloat(ShaderProp1st_ShadeColor_Feather));
material.SetFloat(ShaderPropShadeColor_Step, material.GetFloat(ShaderProp2nd_ShadeColor_Step)); material.SetFloat(ShaderPropShadeColor_Step, material.GetFloat(ShaderProp2nd_ShadeColor_Step));
material.SetFloat(ShaderProp1st2nd_Shades_Feather, material.GetFloat(ShaderProp2nd_ShadeColor_Feather)); material.SetFloat(ShaderProp1st2nd_Shades_Feather, material.GetFloat(ShaderProp2nd_ShadeColor_Feather));
} }
break; break;
case ShadowMode.SDF: case ShadowMode.SDF:
{ {
material.SetFloat(ShaderPropShadowMode, (int)ShadowMode.SDF); material.SetFloat(ShaderPropShadowMode, (int)ShadowMode.SDF);
material.EnableKeyword(new LocalKeyword(material.shader, "_SDFShadow")); material.EnableKeyword(new LocalKeyword(material.shader, "_SDFShadow"));
m_MaterialEditor.TexturePropertySingleLine(Styles.SDFShadowText, SDFShadowMap); m_MaterialEditor.TexturePropertySingleLine(Styles.SDFShadowText, SDFShadowMap);
GUI_RangeProperty(material, Styles.SDFShadowLevelText); GUI_RangeProperty(material, Styles.SDFShadowLevelText);
GUI_RangeProperty(material, Styles.SDFSmoothGammaText); GUI_RangeProperty(material, Styles.SDFSmoothGammaText);
GUI_RangeProperty(material, Styles.SDFNoseHighlightCoefText); GUI_RangeProperty(material, Styles.SDFNoseHighlightCoefText);
GUI_RangeProperty(material, Styles.SDFNoseHighlightSmoothRange); GUI_RangeProperty(material, Styles.SDFNoseHighlightSmoothRange);
} }
break; break;
} }
EditorGUILayout.Space(); EditorGUILayout.Space();
@@ -1721,60 +1721,60 @@ namespace UnityEditor.Rendering.Toon
switch (m_pbrMode) switch (m_pbrMode)
{ {
case PBRMode.Off: case PBRMode.Off:
{ {
material.SetFloat(ShaderPropPBR, (int)PBRMode.Off); material.SetFloat(ShaderPropPBR, (int)PBRMode.Off);
material.EnableKeyword("_PBR_Mode_OFF"); material.EnableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST"); material.DisableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO"); material.DisableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK"); material.DisableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON"); material.DisableKeyword("_PBR_Mode_TOON");
} }
break; break;
case PBRMode.Standard: case PBRMode.Standard:
{ {
material.SetFloat(ShaderPropPBR, (int)PBRMode.Standard); material.SetFloat(ShaderPropPBR, (int)PBRMode.Standard);
material.DisableKeyword("_PBR_Mode_OFF"); material.DisableKeyword("_PBR_Mode_OFF");
material.EnableKeyword("_PBR_Mode_ST"); material.EnableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO"); material.DisableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK"); material.DisableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON"); material.DisableKeyword("_PBR_Mode_TOON");
} }
break; break;
case PBRMode.Anisotropy: case PBRMode.Anisotropy:
{ {
material.SetFloat(ShaderPropPBR, (int)PBRMode.Anisotropy); material.SetFloat(ShaderPropPBR, (int)PBRMode.Anisotropy);
material.DisableKeyword("_PBR_Mode_OFF"); material.DisableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST"); material.DisableKeyword("_PBR_Mode_ST");
material.EnableKeyword("_PBR_Mode_ANISO"); material.EnableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK"); material.DisableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON"); material.DisableKeyword("_PBR_Mode_TOON");
} }
break; break;
case PBRMode.KKHair: case PBRMode.KKHair:
{ {
material.SetFloat(ShaderPropPBR, (int)PBRMode.KKHair); material.SetFloat(ShaderPropPBR, (int)PBRMode.KKHair);
material.DisableKeyword("_PBR_Mode_OFF"); material.DisableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST"); material.DisableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO"); material.DisableKeyword("_PBR_Mode_ANISO");
material.EnableKeyword("_PBR_Mode_KK"); material.EnableKeyword("_PBR_Mode_KK");
material.DisableKeyword("_PBR_Mode_TOON"); material.DisableKeyword("_PBR_Mode_TOON");
} }
break; break;
case PBRMode.Toon: case PBRMode.Toon:
{ {
material.SetFloat(ShaderPropPBR, (int)PBRMode.Toon); material.SetFloat(ShaderPropPBR, (int)PBRMode.Toon);
material.DisableKeyword("_PBR_Mode_OFF"); material.DisableKeyword("_PBR_Mode_OFF");
material.DisableKeyword("_PBR_Mode_ST"); material.DisableKeyword("_PBR_Mode_ST");
material.DisableKeyword("_PBR_Mode_ANISO"); material.DisableKeyword("_PBR_Mode_ANISO");
material.DisableKeyword("_PBR_Mode_KK"); material.DisableKeyword("_PBR_Mode_KK");
material.EnableKeyword("_PBR_Mode_TOON"); material.EnableKeyword("_PBR_Mode_TOON");
} }
break; break;
} }
m_MaterialEditor.TexturePropertySingleLine(Styles.normalMapText, normalMap, normalScale); m_MaterialEditor.TexturePropertySingleLine(Styles.normalMapText, normalMap, normalScale);
@@ -2515,7 +2515,8 @@ namespace UnityEditor.Rendering.Toon
GUI_FloatProperty(material, Styles.nearestDistanceText); GUI_FloatProperty(material, Styles.nearestDistanceText);
EditorGUI.indentLevel--; EditorGUI.indentLevel--;
var useOutlineTexture = GUI_Toggle(material, Styles.outlineColorMapText, ShaderPropIs_OutlineTex, MaterialGetInt(material, ShaderPropIs_OutlineTex) != 0); ; var useOutlineTexture = GUI_Toggle(material, Styles.outlineColorMapText, ShaderPropIs_OutlineTex, MaterialGetInt(material, ShaderPropIs_OutlineTex) != 0);
;
EditorGUI.BeginDisabledGroup(!useOutlineTexture); EditorGUI.BeginDisabledGroup(!useOutlineTexture);
m_MaterialEditor.TexturePropertySingleLine(Styles.outlineTexText, outlineTex); m_MaterialEditor.TexturePropertySingleLine(Styles.outlineTexText, outlineTex);
EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup();

View File

@@ -9,7 +9,6 @@ namespace Unity.Toonshader
public struct UTSOutlineSetting public struct UTSOutlineSetting
{ {
public bool enable; public bool enable;
public RenderingLayerMask renderingLayer;
} }
[Serializable] [Serializable]
@@ -23,7 +22,8 @@ namespace Unity.Toonshader
public class UTSRenderPassSettings : ScriptableObject public class UTSRenderPassSettings : ScriptableObject
{ {
public const string UTS_RENDERING_SETTINGS_NAME = "UTSRenderingSettings"; public const string UTS_RENDERING_SETTINGS_NAME = "UTSRenderingSettings";
private const string UTS_Rendering_Settings_Path = "Packages/com.misaki.hdrp-toon/Runtime/HDRP/Resources/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 UTSOutlineSetting outlineSetting; public UTSOutlineSetting outlineSetting;
public UtsHairShadowSetting hairShadowSetting; public UtsHairShadowSetting hairShadowSetting;
@@ -37,21 +37,22 @@ namespace Unity.Toonshader
} }
UTSRenderPassSettings renderingSettings = null; UTSRenderPassSettings renderingSettings = null;
if (File.Exists(UTS_Rendering_Settings_Path)) if (File.Exists(UTS_RENDERING_SETTINGS_PATH))
{ {
renderingSettings = AssetDatabase.LoadAssetAtPath<UTSRenderPassSettings>(UTS_Rendering_Settings_Path); renderingSettings = AssetDatabase.LoadAssetAtPath<UTSRenderPassSettings>(UTS_RENDERING_SETTINGS_PATH);
} }
else else
{ {
renderingSettings = CreateInstance<UTSRenderPassSettings>(); renderingSettings = CreateInstance<UTSRenderPassSettings>();
AssetDatabase.CreateAsset(renderingSettings, UTS_Rendering_Settings_Path); AssetDatabase.CreateAsset(renderingSettings, UTS_RENDERING_SETTINGS_PATH);
AssetDatabase.Refresh();
} }
EditorBuildSettings.AddConfigObject(UTS_RENDERING_SETTINGS_NAME, renderingSettings, false); EditorBuildSettings.AddConfigObject(UTS_RENDERING_SETTINGS_NAME, renderingSettings, true);
return renderingSettings; return renderingSettings;
#else #else
return Resources.Load<UTSRenderPassSettings>(Path.GetFileNameWithoutExtension(UTS_Rendering_Settings_Path)); return Resources.Load<UTSRenderPassSettings>(UTS_RENDERING_SETTINGS_RESOURCES_PATH);
#endif #endif
} }

View File

@@ -1,24 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 02a9f5e1730430c4090d73e427a7f7a3, type: 3}
m_Name: UTSRenderSettings
m_EditorClassIdentifier:
outlineSetting:
enable: 1
renderingLayer:
serializedVersion: 0
m_Bits: 2
hairShadowSetting:
enable: 1
CasterRenderingLayer:
serializedVersion: 0
m_Bits: 4

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 37f2c2f5a413a874b9ec560b74248a71
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -184,7 +184,7 @@ Shader "HDRP/Toon"
[HideInInspector][ToggleUI] _TransparentZWrite("_TransparentZWrite", Float) = 0.0 [HideInInspector][ToggleUI] _TransparentZWrite("_TransparentZWrite", Float) = 0.0
[HideInInspector] _CullMode("__cullmode", Float) = 2.0 [HideInInspector] _CullMode("__cullmode", Float) = 2.0
[HideInInspector] _CullModeForward("__cullmodeForward", Float) = 2.0 // This mode is dedicated to Forward to correctly handle backface then front face rendering thin transparent [HideInInspector] _CullModeForward("__cullmodeForward", Float) = 2.0 // This mode is dedicated to Forward to correctly handle backface then front face rendering thin transparent
[Enum(UnityEditor.Rendering.HighDefinition.TransparentCullMode)] _TransparentCullMode("_TransparentCullMode", Int) = 2 // Back culling by default [HideInInspector] _TransparentCullMode("_TransparentCullMode", Int) = 2 // Back culling by default
[HideInInspector] _ZTestDepthEqualForOpaque("_ZTestDepthEqualForOpaque", Int) = 4 // Less equal [HideInInspector] _ZTestDepthEqualForOpaque("_ZTestDepthEqualForOpaque", Int) = 4 // Less equal
[HideInInspector] _ZTestModeDistortion("_ZTestModeDistortion", Int) = 8 [HideInInspector] _ZTestModeDistortion("_ZTestModeDistortion", Int) = 8
[HideInInspector] _ZTestGBuffer("_ZTestGBuffer", Int) = 4 [HideInInspector] _ZTestGBuffer("_ZTestGBuffer", Int) = 4

View File

@@ -1,130 +0,0 @@
Shader "Renderers/HairShadowRenderer"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
_ColorMap("ColorMap", 2D) = "white" {}
// Transparency
_AlphaCutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
[HideInInspector]_BlendMode("_BlendMode", Range(0.0, 1.0)) = 0.5
}
HLSLINCLUDE
#pragma target 4.5
#pragma only_renderers d3d11 playstation xboxone xboxseries vulkan metal switch
// #pragma enable_d3d11_debug_symbols
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"
//#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"
//enable GPU instancing support
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
ENDHLSL
SubShader
{
Tags{ "RenderPipeline" = "HDRenderPipeline" }
Pass
{
Name "HairShadow"
Tags { "LightMode" = "HairShadow" }
Blend Off
ZWrite On
ZTest LEqual
Cull Front
HLSLPROGRAM
#define _SURFACE_TYPE_OPAQUE
// Toggle the alpha test
#define _ALPHATEST_ON
// Toggle transparency
// #define _SURFACE_TYPE_TRANSPARENT
// Toggle fog on transparent
#define _ENABLE_FOG_ON_TRANSPARENT
// List all the attributes needed in your shader (will be passed to the vertex shader)
// you can see the complete list of these attributes in VaryingMesh.hlsl
#define ATTRIBUTES_NEED_TEXCOORD0
#define ATTRIBUTES_NEED_NORMAL
#define ATTRIBUTES_NEED_TANGENT
// List all the varyings needed in your fragment shader
#define VARYINGS_NEED_TEXCOORD0
#define VARYINGS_NEED_TANGENT_TO_WORLD
#define SHADERPASS SHADERPASS_FORWARD_UNLIT
int _HairShadowPassChannel;
TEXTURE2D(_ColorMap);
TEXTURE2D(_HairShadowTex);
SAMPLER(sampler_HairShadowTex);
// Declare properties in the UnityPerMaterial cbuffer to make the shader compatible with SRP Batcher.
CBUFFER_START(UnityPerMaterial)
float4 _ColorMap_ST;
float4 _Color;
float _AlphaCutoff;
float _BlendMode;
CBUFFER_END
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassRenderersV2.hlsl"
// If you need to modify the vertex datas, you can uncomment this code
// Note: all the transformations here are done in object space
// #define HAVE_MESH_MODIFICATION
// AttributesMesh ApplyMeshModification(AttributesMesh input, float3 timeParameters)
// {
// input.positionOS += input.normalOS * 0.0001; // inflate a bit the mesh to avoid z-fight
// return input;
// }
// Put the code to render the objects in your custom pass in this function
void GetSurfaceAndBuiltinData(FragInputs fragInputs, float3 viewDirection, inout PositionInputs posInput, out SurfaceData surfaceData, out BuiltinData builtinData)
{
float cDepth = SampleCameraDepth(posInput.positionNDC);
float mDepth = posInput.deviceDepth;
float opacity = 1;
// const float3 color = float3(LinearEyeDepth(posInput.deviceDepth, _ZBufferParams), 0, 0);
// A manual depth test is needed here. Custom pass will always draw with no regard of depth.
// This test was given a quite large leeway to avoid discarding when cDepth = mDepth [Suomi, 20230915]
//float3 color = float3(cDepth < mDepth + 0.01 ? mDepth : 0, 0, 0); // Can get that in HDRP directly
float3 color = float3(0, 0, 0);
color.r = mDepth;
#ifdef _ALPHATEST_ON
DoAlphaTest(opacity, _AlphaCutoff);
#endif
// Write back the data to the output structures
ZERO_BUILTIN_INITIALIZE(builtinData); // No call to InitBuiltinData as we don't have any lighting
ZERO_INITIALIZE(SurfaceData, surfaceData);
builtinData.opacity = opacity;
builtinData.emissiveColor = float3(0, 0, 0);
surfaceData.color = color;
}
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassForwardUnlit.hlsl"
#pragma vertex Vert
#pragma fragment Frag
ENDHLSL
}
}
}

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: b3740fc2ef8a5094a81cfb53915422de
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
preprocessorOverride: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -194,13 +194,13 @@ void Frag(PackedVaryingsToPS packedInput,
#ifdef VARYINGS_NEED_POSITION_WS #ifdef VARYINGS_NEED_POSITION_WS
float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS);
#ifdef _EYE_PARALLAX #ifdef _EYE_PARALLAX
// Must have view Dir to work // Must have view Dir to work
float2 viewT = TransformObjectToTangent(V, input.tangentToWorld); float2 viewT = TransformObjectToTangent(V, input.tangentToWorld);
float2 parallaxOffset = viewT; float2 parallaxOffset = viewT;
parallaxOffset.y = -parallaxOffset.y; parallaxOffset.y = -parallaxOffset.y;
Set_UV0.xy = clamp(Set_UV0.xy -_EyeParallaxAmount * parallaxOffset, 0, 1); Set_UV0.xy = clamp(Set_UV0.xy -_EyeParallaxAmount * parallaxOffset, 0, 1);
#endif #endif
#else #else
// Unused // Unused
@@ -249,11 +249,11 @@ void Frag(PackedVaryingsToPS packedInput,
#ifdef _ANISOTROPYMAP #ifdef _ANISOTROPYMAP
surfaceData.anisotropy = SAMPLE_TEXTURE2D(_AnisotropyMap, sampler_AnisotropyMap, TRANSFORM_TEX(Set_UV0, _AnisotropyMap)).r; surfaceData.anisotropy = SAMPLE_TEXTURE2D(_AnisotropyMap, sampler_AnisotropyMap, TRANSFORM_TEX(Set_UV0, _AnisotropyMap)).r;
#if _PBR_Mode_KK #if _PBR_Mode_KK
surfaceData.anisotropy += ADD_IDX(_Anisotropy) - 0.5; surfaceData.anisotropy += ADD_IDX(_Anisotropy) - 0.5;
#else #else
surfaceData.anisotropy *= ADD_IDX(_Anisotropy); surfaceData.anisotropy *= ADD_IDX(_Anisotropy);
#endif #endif
#else #else
surfaceData.anisotropy = 1.0; surfaceData.anisotropy = 1.0;
surfaceData.anisotropy *= ADD_IDX(_Anisotropy); surfaceData.anisotropy *= ADD_IDX(_Anisotropy);
@@ -267,9 +267,9 @@ void Frag(PackedVaryingsToPS packedInput,
#ifdef _PBR_Mode_TOON #ifdef _PBR_Mode_TOON
float3 _SpecTex_var = 1; float3 _SpecTex_var = 1;
#ifdef _SPECULARCOLORMAP #ifdef _SPECULARCOLORMAP
_SpecTex_var = SAMPLE_TEXTURE2D(_SpecularColorMap, sampler_SpecularColorMap, TRANSFORM_TEX(Set_UV0, _BaseColorMap)).rgb; _SpecTex_var = SAMPLE_TEXTURE2D(_SpecularColorMap, sampler_SpecularColorMap, TRANSFORM_TEX(Set_UV0, _BaseColorMap)).rgb;
#endif #endif
specularColor = _SpecTex_var * _SpecularColor; specularColor = _SpecTex_var * _SpecularColor;
#else #else
specularColor = SpecularColor(_MainTex_var.rgb * _BaseColor.rgb, metallic); specularColor = SpecularColor(_MainTex_var.rgb * _BaseColor.rgb, metallic);
@@ -298,7 +298,7 @@ void Frag(PackedVaryingsToPS packedInput,
bsdfData.tangentWS = tangentDir; bsdfData.tangentWS = tangentDir;
bsdfData.bitangentWS = bitangentDir; bsdfData.bitangentWS = bitangentDir;
PreLightData preLightData = GetPreLightData(V, posInput, bsdfData); // used to calc shadow PreLightData preLightData = GetPreLightData(V, posInput, bsdfData); // used to calc shadow
UTSAggregateLighting utsAggregateLighting; UTSAggregateLighting utsAggregateLighting;
ZERO_INITIALIZE(UTSAggregateLighting, utsAggregateLighting); ZERO_INITIALIZE(UTSAggregateLighting, utsAggregateLighting);
@@ -351,13 +351,13 @@ void Frag(PackedVaryingsToPS packedInput,
float3 lightColor = ApplyCurrentExposureMultiplier(lightData.color); float3 lightColor = ApplyCurrentExposureMultiplier(lightData.color);
float3 lightDirection = -lightData.forward; float3 lightDirection = -lightData.forward;
#ifndef LIGHT_EVALUATION_NO_COOKIE #ifndef LIGHT_EVALUATION_NO_COOKIE
if (lightData.cookieMode != COOKIEMODE_NONE) if (lightData.cookieMode != COOKIEMODE_NONE)
{ {
float3 lightToSample = input.positionRWS - lightData.positionRWS; float3 lightToSample = input.positionRWS - lightData.positionRWS;
lightColor *= EvaluateCookie_Directional(context, lightData, lightToSample); lightColor *= EvaluateCookie_Directional(context, lightData, lightToSample);
} }
#endif #endif
UTSLightData utsLightData; UTSLightData utsLightData;
utsLightData.lightDirection = lightDirection; utsLightData.lightDirection = lightDirection;
@@ -416,33 +416,33 @@ void Frag(PackedVaryingsToPS packedInput,
light.shadowIndex, L); light.shadowIndex, L);
} }
#endif // UTS_USE_RAYTRACING_SHADOW #endif // UTS_USE_RAYTRACING_SHADOW
} }
#if defined (UTS_USE_RAYTRACING_SHADOW) #if defined (UTS_USE_RAYTRACING_SHADOW)
else else
{ {
float r = UNITY_SAMPLE_SCREEN_SHADOW(_RaytracedHardShadow, float4(posInput.positionNDC.xy, lightDirection * _ShadowBias, 1)); float r = UNITY_SAMPLE_SCREEN_SHADOW(_RaytracedHardShadow, float4(posInput.positionNDC.xy, lightDirection * _ShadowBias, 1));
context.shadowValue = r; context.shadowValue = r;
} }
#endif // UTS_USE_RAYTRACING_SHADOW #endif // UTS_USE_RAYTRACING_SHADOW
} }
context.shadowValue = lerp(1, context.shadowValue, lightData.shadowDimmer); context.shadowValue = lerp(1, context.shadowValue, lightData.shadowDimmer);
customMainLight.shadowValue = context.shadowValue; customMainLight.shadowValue = context.shadowValue;
} }
#if defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SELFSHADOW)
if (_DirectionalShadowIndex >= 0) if (_DirectionalShadowIndex >= 0)
finalColor = UTS_SelfShdowMainLight(context, input, _DirectionalShadowIndex); finalColor = UTS_SelfShdowMainLight(context, input, _DirectionalShadowIndex);
#else #else
UTS_MainLight(context, input, utsLightData, surfaceData, bsdfData, inverseClipping, channelAlpha, utsData, utsAggregateLighting); UTS_MainLight(context, input, utsLightData, surfaceData, bsdfData, inverseClipping, channelAlpha, utsData, utsAggregateLighting);
#endif #endif
int i = 0; // Declare once to avoid the D3D11 compiler warning. int i = 0; // Declare once to avoid the D3D11 compiler warning.
for (i = 0; i < (int)_DirectionalLightCount; ++i) for (i = 0; i < (int) _DirectionalLightCount; ++i)
{ {
if (IsMatchingLightLayer(_DirectionalLightDatas[i].lightLayers, builtinData.renderingLayers)) if (IsMatchingLightLayer(_DirectionalLightDatas[i].lightLayers, builtinData.renderingLayers))
{ {
@@ -457,11 +457,11 @@ void Frag(PackedVaryingsToPS packedInput,
utsLightData.shadowTint = _DirectionalLightDatas[i].shadowTint; utsLightData.shadowTint = _DirectionalLightDatas[i].shadowTint;
utsLightData.penumbraTint = _DirectionalLightDatas[i].penumbraTint; utsLightData.penumbraTint = _DirectionalLightDatas[i].penumbraTint;
#if defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SELFSHADOW)
#else #else
UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, 0, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting); UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, 0, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting);
#endif #endif
} }
} }
} }
@@ -476,14 +476,14 @@ void Frag(PackedVaryingsToPS packedInput,
{ {
uint lightCount, lightStart; uint lightCount, lightStart;
#ifndef LIGHTLOOP_DISABLE_TILE_AND_CLUSTER #ifndef LIGHTLOOP_DISABLE_TILE_AND_CLUSTER
GetCountAndStart(posInput, LIGHTCATEGORY_PUNCTUAL, lightStart, lightCount); GetCountAndStart(posInput, LIGHTCATEGORY_PUNCTUAL, lightStart, lightCount);
#else // LIGHTLOOP_DISABLE_TILE_AND_CLUSTER #else // LIGHTLOOP_DISABLE_TILE_AND_CLUSTER
lightCount = _PunctualLightCount; lightCount = _PunctualLightCount;
lightStart = 0; lightStart = 0;
#endif #endif
bool fastPath = false; bool fastPath = false;
#if SCALARIZE_LIGHT_LOOP #if SCALARIZE_LIGHT_LOOP
uint lightStartLane0; uint lightStartLane0;
fastPath = IsFastPath(lightStart, lightStartLane0); fastPath = IsFastPath(lightStart, lightStartLane0);
@@ -491,7 +491,7 @@ void Frag(PackedVaryingsToPS packedInput,
{ {
lightStart = lightStartLane0; lightStart = lightStartLane0;
} }
#endif #endif
@@ -508,11 +508,11 @@ void Frag(PackedVaryingsToPS packedInput,
while (v_lightListOffset < lightCount) while (v_lightListOffset < lightCount)
{ {
v_lightIdx = FetchIndex(lightStart, v_lightListOffset); v_lightIdx = FetchIndex(lightStart, v_lightListOffset);
#if SCALARIZE_LIGHT_LOOP #if SCALARIZE_LIGHT_LOOP
uint s_lightIdx = ScalarizeElementIndex(v_lightIdx, fastPath); uint s_lightIdx = ScalarizeElementIndex(v_lightIdx, fastPath);
#else #else
uint s_lightIdx = v_lightIdx; uint s_lightIdx = v_lightIdx;
#endif #endif
if (s_lightIdx == -1) if (s_lightIdx == -1)
break; break;
@@ -541,9 +541,9 @@ void Frag(PackedVaryingsToPS packedInput,
utsLightData.shadowTint = s_lightData.shadowTint; utsLightData.shadowTint = s_lightData.shadowTint;
utsLightData.penumbraTint = s_lightData.penumbraTint; utsLightData.penumbraTint = s_lightData.penumbraTint;
#if defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SELFSHADOW)
#else #else
posInput.positionWS = posInput.positionWS + lightDirection * _ShadowBias; posInput.positionWS = posInput.positionWS + lightDirection * _ShadowBias;
float shadow = EvaluateShadow_Punctual(context, posInput, s_lightData, builtinData, GetNormalForShadowBias(bsdfData), lightDirection, distances); float shadow = EvaluateShadow_Punctual(context, posInput, s_lightData, builtinData, GetNormalForShadowBias(bsdfData), lightDirection, distances);
context.shadowValue = shadow; context.shadowValue = shadow;
@@ -565,7 +565,7 @@ void Frag(PackedVaryingsToPS packedInput,
} }
UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting); UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting);
#endif #endif
} }
} }
@@ -578,12 +578,12 @@ void Frag(PackedVaryingsToPS packedInput,
{ {
uint lightCount, lightStart; uint lightCount, lightStart;
#ifndef LIGHTLOOP_DISABLE_TILE_AND_CLUSTER #ifndef LIGHTLOOP_DISABLE_TILE_AND_CLUSTER
GetCountAndStart(posInput, LIGHTCATEGORY_AREA, lightStart, lightCount); GetCountAndStart(posInput, LIGHTCATEGORY_AREA, lightStart, lightCount);
#else #else
lightCount = _AreaLightCount; lightCount = _AreaLightCount;
lightStart = _PunctualLightCount; lightStart = _PunctualLightCount;
#endif #endif
// COMPILER BEHAVIOR WARNING! // COMPILER BEHAVIOR WARNING!
// If rectangle lights are before line lights, the compiler will duplicate light matrices in VGPR because they are used differently between the two types of lights. // If rectangle lights are before line lights, the compiler will duplicate light matrices in VGPR because they are used differently between the two types of lights.
@@ -648,13 +648,13 @@ void Frag(PackedVaryingsToPS packedInput,
//Evaluate the shadow part //Evaluate the shadow part
float shadow; float shadow;
posInput.positionWS = posInput.positionWS + utsLightData.lightDirection * _ShadowBias; posInput.positionWS = posInput.positionWS + utsLightData.lightDirection * _ShadowBias;
#if defined(SCREEN_SPACE_SHADOWS_ON) && !defined(_SURFACE_TYPE_TRANSPARENT) #if defined(SCREEN_SPACE_SHADOWS_ON) && !defined(_SURFACE_TYPE_TRANSPARENT)
if ((s_lightData.screenSpaceShadowIndex & SCREEN_SPACE_SHADOW_INDEX_MASK) != INVALID_SCREEN_SPACE_SHADOW) if ((s_lightData.screenSpaceShadowIndex & SCREEN_SPACE_SHADOW_INDEX_MASK) != INVALID_SCREEN_SPACE_SHADOW)
{ {
shadow = GetScreenSpaceShadow(posInput, s_lightData.screenSpaceShadowIndex); shadow = GetScreenSpaceShadow(posInput, s_lightData.screenSpaceShadowIndex);
} }
else else
#endif #endif
{ {
shadow = EvaluateShadow_RectArea(context, posInput, s_lightData, builtinData, GetNormalForShadowBias(bsdfData), normalize(s_lightData.positionRWS), length(s_lightData.positionRWS)); shadow = EvaluateShadow_RectArea(context, posInput, s_lightData, builtinData, GetNormalForShadowBias(bsdfData), normalize(s_lightData.positionRWS), length(s_lightData.positionRWS));
} }
@@ -662,21 +662,21 @@ void Frag(PackedVaryingsToPS packedInput,
posInput.positionWS = posInput.positionWS - lightDirection * _ShadowBias; posInput.positionWS = posInput.positionWS - lightDirection * _ShadowBias;
} }
#if defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SELFSHADOW)
#else #else
UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting); UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting);
//utsAggregateLighting.directDiffuse += ltcValue.rgb * ltcValue.a * intensity * s_lightData.diffuseDimmer; //utsAggregateLighting.directDiffuse += ltcValue.rgb * ltcValue.a * intensity * s_lightData.diffuseDimmer;
//utsAggregateLighting.directDiffuse += intensity; //utsAggregateLighting.directDiffuse += intensity;
#endif #endif
/* /*
if(s_lightData.lightType == GPULIGHTTYPE_RECTANGLE) if(s_lightData.lightType == GPULIGHTTYPE_RECTANGLE)
{ {
#if SHADEROPTIONS_BARN_DOOR #if SHADEROPTIONS_BARN_DOOR
// Apply the barn door modification to the light data // Apply the barn door modification to the light data
RectangularLightApplyBarnDoor(s_lightData, posInput.positionWS); RectangularLightApplyBarnDoor(s_lightData, posInput.positionWS);
#endif #endif
if (dot(s_lightData.forward, unL) < FLT_EPS) if (dot(s_lightData.forward, unL) < FLT_EPS)
{ {
@@ -691,15 +691,15 @@ void Frag(PackedVaryingsToPS packedInput,
float intensity; float intensity;
// Compute the light attenuation. // Compute the light attenuation.
#ifdef ELLIPSOIDAL_ATTENUATION #ifdef ELLIPSOIDAL_ATTENUATION
// The attenuation volume is an axis-aligned ellipsoid s.t. // The attenuation volume is an axis-aligned ellipsoid s.t.
// r1 = (r + w / 2), r2 = (r + h / 2), r3 = r. // r1 = (r + w / 2), r2 = (r + h / 2), r3 = r.
intensity = EllipsoidalDistanceAttenuation(unL, invHalfDim, s_lightData.rangeAttenuationScale, s_lightData.rangeAttenuationBias); intensity = EllipsoidalDistanceAttenuation(unL, invHalfDim, s_lightData.rangeAttenuationScale, s_lightData.rangeAttenuationBias);
#else #else
// The attenuation volume is an axis-aligned box s.t. // The attenuation volume is an axis-aligned box s.t.
// hX = (r + w / 2), hY = (r + h / 2), hZ = r. // hX = (r + w / 2), hY = (r + h / 2), hZ = r.
intensity = BoxDistanceAttenuation(unL, invHalfDim, s_lightData.rangeAttenuationScale, s_lightData.rangeAttenuationBias); intensity = BoxDistanceAttenuation(unL, invHalfDim, s_lightData.rangeAttenuationScale, s_lightData.rangeAttenuationBias);
#endif #endif
if(intensity != 0.0f) if(intensity != 0.0f)
{ {
@@ -727,12 +727,12 @@ void Frag(PackedVaryingsToPS packedInput,
float4x3 LD = mul(lightVerts, preLightData.ltcTransformDiffuse); float4x3 LD = mul(lightVerts, preLightData.ltcTransformDiffuse);
float3 formFactorD; float3 formFactorD;
#ifdef APPROXIMATE_POLY_LIGHT_AS_SPHERE_LIGHT #ifdef APPROXIMATE_POLY_LIGHT_AS_SPHERE_LIGHT
formFactorD = PolygonFormFactor(LD, real3(0,0,1), 4); formFactorD = PolygonFormFactor(LD, real3(0,0,1), 4);
ltcValue = PolygonIrradianceFromVectorFormFactor(formFactorD); ltcValue = PolygonIrradianceFromVectorFormFactor(formFactorD);
#else #else
ltcValue = PolygonIrradiance(LD); ltcValue = PolygonIrradiance(LD);
#endif #endif
utsLightData.diffuseDimmer *= ltcValue; utsLightData.diffuseDimmer *= ltcValue;
@@ -740,36 +740,36 @@ void Frag(PackedVaryingsToPS packedInput,
// Polygon irradiance in the transformed configuration. // Polygon irradiance in the transformed configuration.
float4x3 LS = mul(lightVerts, preLightData.ltcTransformSpecular); float4x3 LS = mul(lightVerts, preLightData.ltcTransformSpecular);
float3 formFactorS; float3 formFactorS;
#ifdef APPROXIMATE_POLY_LIGHT_AS_SPHERE_LIGHT #ifdef APPROXIMATE_POLY_LIGHT_AS_SPHERE_LIGHT
formFactorS = PolygonFormFactor(LS, real3(0,0,1), 4); formFactorS = PolygonFormFactor(LS, real3(0,0,1), 4);
ltcValue = PolygonIrradianceFromVectorFormFactor(formFactorS); ltcValue = PolygonIrradianceFromVectorFormFactor(formFactorS);
#else #else
ltcValue = PolygonIrradiance(LS); ltcValue = PolygonIrradiance(LS);
#endif #endif
utsLightData.specularDimmer *= ltcValue; utsLightData.specularDimmer *= ltcValue;
//Evaluate the shadow part //Evaluate the shadow part
float shadow; float shadow;
posInput.positionWS = posInput.positionWS + lightDirection * _ShadowBias; posInput.positionWS = posInput.positionWS + lightDirection * _ShadowBias;
#if defined(SCREEN_SPACE_SHADOWS_ON) && !defined(_SURFACE_TYPE_TRANSPARENT) #if defined(SCREEN_SPACE_SHADOWS_ON) && !defined(_SURFACE_TYPE_TRANSPARENT)
if ((s_lightData.screenSpaceShadowIndex & SCREEN_SPACE_SHADOW_INDEX_MASK) != INVALID_SCREEN_SPACE_SHADOW) if ((s_lightData.screenSpaceShadowIndex & SCREEN_SPACE_SHADOW_INDEX_MASK) != INVALID_SCREEN_SPACE_SHADOW)
{ {
shadow = GetScreenSpaceShadow(posInput, s_lightData.screenSpaceShadowIndex); shadow = GetScreenSpaceShadow(posInput, s_lightData.screenSpaceShadowIndex);
} }
else else
#endif #endif
{ {
shadow = EvaluateShadow_RectArea(context, posInput, s_lightData, builtinData, GetNormalForShadowBias(bsdfData), normalize(s_lightData.positionRWS), length(s_lightData.positionRWS)); shadow = EvaluateShadow_RectArea(context, posInput, s_lightData, builtinData, GetNormalForShadowBias(bsdfData), normalize(s_lightData.positionRWS), length(s_lightData.positionRWS));
} }
context.shadowValue = shadow; context.shadowValue = shadow;
posInput.positionWS = posInput.positionWS - lightDirection * _ShadowBias; posInput.positionWS = posInput.positionWS - lightDirection * _ShadowBias;
#if defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SELFSHADOW)
#else #else
UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting); UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting);
#endif #endif
} }
} }
} }
@@ -818,11 +818,11 @@ void Frag(PackedVaryingsToPS packedInput,
ltcValue = LTCEvaluate(P1, P2, B, preLightData.ltcTransformSpecular); ltcValue = LTCEvaluate(P1, P2, B, preLightData.ltcTransformSpecular);
utsLightData.specularDimmer *= ltcValue; utsLightData.specularDimmer *= ltcValue;
#if defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SELFSHADOW)
#else #else
UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting); UTS_OtherLights(context, input, utsLightData, surfaceData, bsdfData, s_lightData.lightType, i_normalDir, notDirectional, channelAlpha, utsAggregateLighting);
#endif #endif
} }
} }
*/ */
@@ -917,8 +917,12 @@ void Frag(PackedVaryingsToPS packedInput,
if(hairShadowOpacity > 0) if(hairShadowOpacity > 0)
{ {
float3 viewLightDir = TransformWorldToViewDir(customMainLight.lightDirection); // / posInput.deviceDepth; when linearDepth grows large, the movement amount should be lower since we are getting further from the face. float3 viewLightDir = TransformWorldToViewDir(customMainLight.lightDirection); // / posInput.deviceDepth; when linearDepth grows large, the movement amount should be lower since we are getting further from the face.
float shadowLength = _HairShadowDistance * 5.0 * max(0.5, posInput.linearDepth * _HairShadowDistanceScaleFactor) / posInput.linearDepth; float3 cameraDirOS = normalize(TransformWorldToObject(GetCameraPositionWS()));
float shadowLengthY = _HairShadowDistance * 5.0 * max(0.5, posInput.linearDepth * _HairShadowDistanceScaleFactor) / posInput.linearDepth;
float2 shadowLength = float2(shadowLengthY * 2.0f, shadowLengthY);
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); float4 hairBuffer = SAMPLE_TEXTURE2D(_HairShadowTex, s_trilinear_clamp_sampler, samplingPoint);
float hairDepth = hairBuffer.r; float hairDepth = hairBuffer.r;
@@ -937,7 +941,7 @@ void Frag(PackedVaryingsToPS packedInput,
float3 finalColorWoEmissive = AccumulateAggregateLighting(utsAggregateLighting); float3 finalColorWoEmissive = AccumulateAggregateLighting(utsAggregateLighting);
finalColorWoEmissive = GetExposureAdjustedColor(finalColorWoEmissive ); finalColorWoEmissive = GetExposureAdjustedColor(finalColorWoEmissive);
finalColorWoEmissive = ApplyCompensation(finalColorWoEmissive); finalColorWoEmissive = ApplyCompensation(finalColorWoEmissive);
finalColor = finalColorWoEmissive + emissive; finalColor = finalColorWoEmissive + emissive;
@@ -967,29 +971,28 @@ void Frag(PackedVaryingsToPS packedInput,
mDepth = hairPixel > 0.1 ? max(hDepth.r, mDepth) + magic : mDepth; // Move this part of eyebrow in front of the hair mDepth = hairPixel > 0.1 ? max(hDepth.r, mDepth) + magic : mDepth; // Move this part of eyebrow in front of the hair
// Added a max here to prevent sampling of hair in the back // Added a max here to prevent sampling of hair in the back
if(cDepth - mDepth > 0.02) discard; // Manual Depth Test. if(cDepth - mDepth > 0.02) // Manual Depth Test
{
// _EyeBrowBlendingFactor discard;
}
outColor.a = _EyeBrowBlendingFactor; outColor.a = _EyeBrowBlendingFactor;
outColor.a = hairPixel > 0.01 ? outColor.a : 1 ; outColor.a = hairPixel > 0.01 ? outColor.a : 1 ;
//outColor.rgb = float3(hDepth.rg * 5,0);
#endif #endif
#if defined(UTS_DEBUG_SHADOWMAP) || defined(UTS_DEBUG_SELFSHADOW) #if defined(UTS_DEBUG_SHADOWMAP) || defined(UTS_DEBUG_SELFSHADOW)
outColor.rgb = 1; outColor.rgb = 1;
#ifdef UTS_DEBUG_SELFSHADOW #ifdef UTS_DEBUG_SELFSHADOW
outColor.rgb = min(finalColor, outColor.rgb); outColor.rgb = min(finalColor, outColor.rgb);
#endif #endif
#ifdef UTS_DEBUG_SHADOWMAP #ifdef UTS_DEBUG_SHADOWMAP
#ifdef UTS_DEBUG_SHADOWMAP_BINALIZATION #ifdef UTS_DEBUG_SHADOWMAP_BINALIZATION
outColor.rgb = min(context.shadowValue < 0.9f ? clamp(context.shadowValue - 0.2, 0.0, 0.9) : 1.0f, outColor.rgb); outColor.rgb = min(context.shadowValue < 0.9f ? clamp(context.shadowValue - 0.2, 0.0, 0.9) : 1.0f, outColor.rgb);
#else #else
outColor.rgb = min(context.shadowValue, outColor.rgb); outColor.rgb = min(context.shadowValue, outColor.rgb);
#endif #endif
#endif // ifdef UTS_DEBUG_SHADOWMAP #endif // ifdef UTS_DEBUG_SHADOWMAP
#endif // defined(UTS_DEBUG_SHADOWMAP) || defined(UTS_DEBUG_SELFSHADOW) #endif // defined(UTS_DEBUG_SHADOWMAP) || defined(UTS_DEBUG_SELFSHADOW)
#ifdef _DEPTHOFFSET_ON #ifdef _DEPTHOFFSET_ON

View File

@@ -277,10 +277,8 @@ void UTS_MainLight(LightLoopContext lightLoopContext, FragInputs input, UTSLight
float4 _Set_RimLightMask_var = tex2D(_Set_RimLightMask, TRANSFORM_TEX(Set_UV0, _Set_RimLightMask)); float4 _Set_RimLightMask_var = tex2D(_Set_RimLightMask, TRANSFORM_TEX(Set_UV0, _Set_RimLightMask));
float3 _Is_LightColor_RimLight_var = lerp(_RimLightColor.rgb, (_RimLightColor.rgb * Set_LightColor), _Is_LightColor_RimLight); float3 _Is_LightColor_RimLight_var = lerp(_RimLightColor.rgb, (_RimLightColor.rgb * Set_LightColor), _Is_LightColor_RimLight);
float _RimArea_var = dot(utsData.normalDirection, utsData.viewDirection); float _RimArea_var = dot(utsData.normalDirection, utsData.viewDirection);
if(_Is_BlendAddToRimColor == 1) _RimArea_var = lerp(_RimArea_var, 1 - _RimArea_var,_Is_BlendAddToRimColor);
{
_RimArea_var = 1 - _RimArea_var;
}
float _RimLightPower_var = pow(_RimArea_var, exp2(lerp(3, 0, _RimLight_Power))); float _RimLightPower_var = pow(_RimArea_var, exp2(lerp(3, 0, _RimLight_Power)));
float _Rimlight_InsideMask_var = saturate(lerp((0.0 + ((_RimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _RimLightPower_var), _RimLight_FeatherOff)); float _Rimlight_InsideMask_var = saturate(lerp((0.0 + ((_RimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _RimLightPower_var), _RimLight_FeatherOff));
float _VertHalfLambert_var = 0.5 * dot(utsData.normalDirection, lightDirection) + 0.5; float _VertHalfLambert_var = 0.5 * dot(utsData.normalDirection, lightDirection) + 0.5;
@@ -296,15 +294,8 @@ void UTS_MainLight(LightLoopContext lightLoopContext, FragInputs input, UTSLight
float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight)); float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight));
Set_RimLight *= _RimLightVisible; Set_RimLight *= _RimLightVisible;
Set_RimLight *= _RimLight_Strength; Set_RimLight *= _RimLight_Strength;
float3 _RimLight_var;
if(_Is_BlendAddToRimColor == 0) float3 _RimLight_var = lerp(lerp(Set_HighColor, (Set_HighColor * Set_RimLight), _RimLight), lerp(Set_HighColor, (Set_HighColor + Set_RimLight), _RimLight), _Is_BlendAddToRimColor);
{
_RimLight_var = lerp(Set_HighColor, (Set_HighColor * Set_RimLight), _RimLight);
}
else
{
_RimLight_var = lerp(Set_HighColor, (Set_HighColor + Set_RimLight), _RimLight);
}
if (any(Set_RimLight) * maskRimEnabled) if (any(Set_RimLight) * maskRimEnabled)
{ {
@@ -317,16 +308,8 @@ void UTS_MainLight(LightLoopContext lightLoopContext, FragInputs input, UTSLight
#else #else
float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight)); float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight));
Set_RimLight *= _RimLight_Strength; Set_RimLight *= _RimLight_Strength;
float3 _RimLight_var;
if(_Is_BlendAddToRimColor == 0)
{
_RimLight_var = lerp(Set_HighColor, (Set_HighColor * Set_RimLight), _RimLight);
}
else
{
_RimLight_var = lerp(Set_HighColor, (Set_HighColor + Set_RimLight), _RimLight);
}
float3 _RimLight_var = lerp(lerp(Set_HighColor, (Set_HighColor * Set_RimLight), _RimLight), lerp(Set_HighColor, (Set_HighColor + Set_RimLight), _RimLight), _Is_BlendAddToRimColor);
_RimLight_var = lerp(_RimLight_var, (_RimLight_var * ((1.0 - Set_FinalShadowMask) + (Set_FinalShadowMask * _TweakHighColorOnShadow))), _Is_UseTweakHighColorOnShadow); _RimLight_var = lerp(_RimLight_var, (_RimLight_var * ((1.0 - Set_FinalShadowMask) + (Set_FinalShadowMask * _TweakHighColorOnShadow))), _Is_UseTweakHighColorOnShadow);
#endif #endif

View File

@@ -164,10 +164,8 @@ void UTS_OtherLights(LightLoopContext lightLoopContext, FragInputs input, UTSLig
float4 _Set_RimLightMask_var = tex2D(_Set_RimLightMask, TRANSFORM_TEX(Set_UV0, _Set_RimLightMask)); float4 _Set_RimLightMask_var = tex2D(_Set_RimLightMask, TRANSFORM_TEX(Set_UV0, _Set_RimLightMask));
float3 _Is_LightColor_RimLight_var = lerp(_RimLightColor.rgb, (_RimLightColor.rgb * Set_LightColor), _Is_LightColor_RimLight); float3 _Is_LightColor_RimLight_var = lerp(_RimLightColor.rgb, (_RimLightColor.rgb * Set_LightColor), _Is_LightColor_RimLight);
float _RimArea_var = dot(surfaceData.normalWS, V); float _RimArea_var = dot(surfaceData.normalWS, V);
if (_Is_BlendAddToRimColor == 1) _RimArea_var = lerp(_RimArea_var, 1 - _RimArea_var, _Is_BlendAddToRimColor);
{
_RimArea_var = 1 - _RimArea_var;
}
float _RimLightPower_var = pow(_RimArea_var, exp2(lerp(3, 0, _RimLight_Power))); float _RimLightPower_var = pow(_RimArea_var, exp2(lerp(3, 0, _RimLight_Power)));
float _Rimlight_InsideMask_var = saturate(lerp((0.0 + ((_RimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _RimLightPower_var), _RimLight_FeatherOff)); float _Rimlight_InsideMask_var = saturate(lerp((0.0 + ((_RimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _RimLightPower_var), _RimLight_FeatherOff));
float _VertHalfLambert_var = 0.5 * dot(surfaceData.normalWS, lightDirection) + 0.5; float _VertHalfLambert_var = 0.5 * dot(surfaceData.normalWS, lightDirection) + 0.5;
@@ -187,15 +185,7 @@ void UTS_OtherLights(LightLoopContext lightLoopContext, FragInputs input, UTSLig
float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight)); float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight));
Set_RimLight *= _RimLightVisible; Set_RimLight *= _RimLightVisible;
Set_RimLight *= _RimLight_Strength; Set_RimLight *= _RimLight_Strength;
if(_Is_BlendAddToRimColor == 0)
{
_HighColor_var = lerp(_HighColor_var, (_HighColor_var * Set_RimLight) * 1, _RimLight);
}
else
{
_HighColor_var = lerp(_HighColor_var, (_HighColor_var + Set_RimLight) * 1, _RimLight);
}
if (any(Set_RimLight) * maskRimEnabled) if (any(Set_RimLight) * maskRimEnabled)
{ {
_HighColor_var = overridingRimColor; _HighColor_var = overridingRimColor;
@@ -215,22 +205,18 @@ void UTS_OtherLights(LightLoopContext lightLoopContext, FragInputs input, UTSLig
diffuseTerm = lerp(diffuseTerm, overrideColor, isMaskEnabled); diffuseTerm = lerp(diffuseTerm, overrideColor, isMaskEnabled);
channelOutAlpha = _HighlightVisible; channelOutAlpha = _HighlightVisible;
} }
// Rim light
diffuseTerm = lerp(lerp(diffuseTerm, (diffuseTerm * Set_RimLight), _RimLight), lerp(diffuseTerm, (diffuseTerm + Set_RimLight), _RimLight), _Is_BlendAddToRimColor);
#else #else
_HighColor_var *= _TweakHighColorMask_var; _HighColor_var *= _TweakHighColorMask_var;
float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight)); float3 Set_RimLight = (saturate((_Set_RimLightMask_var.g + _Tweak_RimLightMaskLevel)) * lerp(_LightDirection_MaskOn_var, (_LightDirection_MaskOn_var + (lerp(_Ap_RimLightColor.rgb, (_Ap_RimLightColor.rgb * Set_LightColor), _Is_LightColor_Ap_RimLight) * saturate((lerp((0.0 + ((_ApRimLightPower_var - _RimLight_InsideMask) * (1.0 - 0.0)) / (1.0 - _RimLight_InsideMask)), step(_RimLight_InsideMask, _ApRimLightPower_var), _Ap_RimLight_FeatherOff) - (saturate(_VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel))))), _Add_Antipodean_RimLight));
Set_RimLight *= _RimLight_Strength; Set_RimLight *= _RimLight_Strength;
if (_Is_BlendAddToRimColor == 0)
{
_HighColor_var = lerp(_HighColor_var, (_HighColor_var * Set_RimLight), _RimLight);
}
else
{
_HighColor_var = lerp(_HighColor_var, (_HighColor_var + Set_RimLight), _RimLight);
}
diffuseTerm = diffuseTerm + lerp(lerp(_HighColor_var, (_HighColor_var * ((1.0 - Set_FinalShadowMask) + (Set_FinalShadowMask * _TweakHighColorOnShadow))), _Is_UseTweakHighColorOnShadow), float3(0, 0, 0), _Is_Filter_HiCutPointLightColor); diffuseTerm = diffuseTerm + lerp(lerp(_HighColor_var, (_HighColor_var * ((1.0 - Set_FinalShadowMask) + (Set_FinalShadowMask * _TweakHighColorOnShadow))), _Is_UseTweakHighColorOnShadow), float3(0, 0, 0), _Is_Filter_HiCutPointLightColor);
// Rim light
diffuseTerm = lerp(lerp(diffuseTerm, (diffuseTerm * Set_RimLight), _RimLight), lerp(diffuseTerm, (diffuseTerm + Set_RimLight), _RimLight), _Is_BlendAddToRimColor);
#endif #endif
// PBR---------------------------------------------------------------------------------------------------------------- // PBR----------------------------------------------------------------------------------------------------------------

View File

@@ -24,7 +24,7 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{ {
_outputRTHandle?.Release(); _outputRTHandle?.Release();
_outputRTHandle = RTHandles.Alloc(Screen.width, Screen.height, colorFormat: GraphicsFormat.D32_SFloat, filterMode: FilterMode.Bilinear, wrapMode: TextureWrapMode.Clamp, name: Output_RT_Name); _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); SetEnable(true);
} }
@@ -54,13 +54,13 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
var mask = RenderStateMask.Nothing; var mask = RenderStateMask.Nothing;
var stateBlock = new RenderStateBlock(mask) var stateBlock = new RenderStateBlock(mask)
{ {
depthState = new DepthState(depthWrite, depthCompareFunction), depthState = new DepthState(true, CompareFunction.LessEqual),
}; };
var result = new RendererListDesc(HDShaderPassNames.s_DepthForwardOnlyName, ctx.cullingResults, ctx.hdCamera.camera) var result = new RendererListDesc(HDShaderPassNames.s_DepthForwardOnlyName, ctx.cullingResults, ctx.hdCamera.camera)
{ {
renderQueueRange = GetRenderQueueRange(renderQueueType), renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
sortingCriteria = sortingCriteria, sortingCriteria = SortingCriteria.CommonOpaque,
excludeObjectMotionVectors = false, excludeObjectMotionVectors = false,
stateBlock = stateBlock, stateBlock = stateBlock,
renderingLayerMask = renderingLayerMask, renderingLayerMask = renderingLayerMask,

View File

@@ -6,7 +6,7 @@ using UnityEngine.Rendering.HighDefinition;
[HideInInspector] [HideInInspector]
public class UTSOutlinePass : DrawRenderersCustomPass public class UTSOutlinePass : DrawRenderersCustomPass
{ {
public UnityEngine.RenderingLayerMask renderingLayerMask; private ShaderTagId outlineTag = new("Outline");
protected override void Execute(CustomPassContext ctx) protected override void Execute(CustomPassContext ctx)
{ {
@@ -19,8 +19,6 @@ public class UTSOutlinePass : DrawRenderersCustomPass
Shader.SetGlobalFloat("_Outline_MaxWidth", utsRenderer.outlineMaxWidth.value * 0.01f); Shader.SetGlobalFloat("_Outline_MaxWidth", utsRenderer.outlineMaxWidth.value * 0.01f);
var outlineTag = new ShaderTagId("Outline");
var mask = RenderStateMask.Nothing; var mask = RenderStateMask.Nothing;
var stateBlock = new RenderStateBlock(mask) var stateBlock = new RenderStateBlock(mask)
{ {
@@ -33,13 +31,9 @@ public class UTSOutlinePass : DrawRenderersCustomPass
var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(outlineTag, ctx.cullingResults, ctx.hdCamera.camera) var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(outlineTag, ctx.cullingResults, ctx.hdCamera.camera)
{ {
rendererConfiguration = renderConfig, rendererConfiguration = renderConfig,
renderQueueRange = GetRenderQueueRange(renderQueueType), renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
sortingCriteria = sortingCriteria,
excludeObjectMotionVectors = false, excludeObjectMotionVectors = false,
overrideMaterial = overrideMaterial,
overrideMaterialPassIndex = (overrideMaterial != null) ? overrideMaterial.FindPass(overrideMaterialPassName) : 0,
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));

View File

@@ -24,7 +24,6 @@ namespace Unity.Toonshader
_outlinePass = new() _outlinePass = new()
{ {
name = "UTS Outline", name = "UTS Outline",
renderingLayerMask = _renderSetting.outlineSetting.renderingLayer
}; };
_hairShadowPass = new() _hairShadowPass = new()
@@ -41,27 +40,26 @@ namespace Unity.Toonshader
[RuntimeInitializeOnLoadMethod] [RuntimeInitializeOnLoadMethod]
public static void RegisterCustomPasses() public static void RegisterCustomPasses()
{ {
CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.AfterOpaqueAndSky, _outlinePass);
CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.AfterOpaqueDepthAndNormal, _hairShadowPass); CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.AfterOpaqueDepthAndNormal, _hairShadowPass);
CustomPassVolume.RegisterUniqueGlobalCustomPass(CustomPassInjectionPoint.BeforePostProcess, _outlinePass);
_outlinePass.enabled = _renderSetting.outlineSetting.enable;
_hairShadowPass.SetEnable(_renderSetting.hairShadowSetting.enable); _hairShadowPass.SetEnable(_renderSetting.hairShadowSetting.enable);
_outlinePass.enabled = _renderSetting.outlineSetting.enable;
} }
public static void UnregisterGlobalCustomPass() public static void UnregisterGlobalCustomPass()
{ {
CustomPassVolume.UnregisterGlobalCustomPass(_outlinePass);
CustomPassVolume.UnregisterGlobalCustomPass(_hairShadowPass); CustomPassVolume.UnregisterGlobalCustomPass(_hairShadowPass);
CustomPassVolume.UnregisterGlobalCustomPass(_outlinePass);
_hairShadowPass.Release(); _hairShadowPass.Release();
} }
public static void NotifyRendererSettingChanged() public static void NotifyRendererSettingChanged()
{ {
_outlinePass.enabled = _renderSetting.outlineSetting.enable;
_outlinePass.renderingLayerMask = _renderSetting.outlineSetting.renderingLayer;
_hairShadowPass.SetEnable(_renderSetting.hairShadowSetting.enable); _hairShadowPass.SetEnable(_renderSetting.hairShadowSetting.enable);
_hairShadowPass.renderingLayerMask = _renderSetting.hairShadowSetting.CasterRenderingLayer; _hairShadowPass.renderingLayerMask = _renderSetting.hairShadowSetting.CasterRenderingLayer;
_outlinePass.enabled = _renderSetting.outlineSetting.enable;
} }
} }
} }

View File

@@ -1,8 +1,9 @@
{ {
"name": "com.misaki.hdrp-toon", "name": "com.misaki.hdrp-toon",
"version": "2.0.1", "version": "2.0.2",
"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",
"keywords": [ "keywords": [
"Toon", "Toon",
"HDRP", "HDRP",