5 Commits

Author SHA1 Message Date
Misaki
48bbf1fa20 Update README and CHANGELOG; 2024-12-26 16:10:14 +09:00
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
18 changed files with 284 additions and 394 deletions

43
CHANGELOG.md Normal file
View File

@@ -0,0 +1,43 @@
# Changelog
All notable changes to this project will be documented in this file.
## [2.0.2] - 26-Dec-2024
### Changed
- Changed the defualt UTS rendering settings location;
- Removed the dependency of RenderingLayerMask in UTSOutlinePass;
### Fixed
- 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;
---
## [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
guid: b8d9ae1381ecb2141b4a741976d1c827
folderAsset: yes
DefaultImporter:
guid: f6d3b51789082774690f2051bbca2438
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:

View File

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

View File

@@ -2515,7 +2515,8 @@ namespace UnityEditor.Rendering.Toon
GUI_FloatProperty(material, Styles.nearestDistanceText);
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);
m_MaterialEditor.TexturePropertySingleLine(Styles.outlineTexText, outlineTex);
EditorGUI.EndDisabledGroup();

View File

@@ -1,3 +1,58 @@
# hdrp-toon
# HDRP Toon Shader
A high quality toon shader for High Definition Render Pipeline(HDRP)
A high-quality toon shader for the High Definition Render Pipeline (HDRP).
---
## Overview
The HDRP Toon Shader is designed to provide a high-quality toon shading effect for projects using Unity's High Definition Render Pipeline and Unity 6. This shader is ideal for creating stylized, cartoon-like visuals with smooth shading and vibrant colors.
## Docs
[Documentation Page](https://doc.personalnas.com/books/hdrp-toon-documentations)
## Features
- **High-Quality Toon Shading**: Achieve smooth and vibrant toon shading effects.
- **Customizable Parameters**: Easily adjust the shader parameters to fit your artistic needs.
- **HDRP Compatibility**: Fully compatible with Unity's High Definition Render Pipeline, including ray-tracing.
- **Performance Optimized**: Designed to be efficient and performant for real-time applications.
## Pre-Requirements
1. Unity version: 6000.0.27f1 or later
2. HDRP version: 17.0.0 or later
## Installation
1. Open your Unity project.
2. Go to `Window > Package Manager`.
3. Click on the `+` button and select `Add package from git`.
4. In the url input field, type: `https://git.personalnas.com/Misaki/com.misaki.hdrp-toon.git`.
5. Click ok to add package into your project.
## Usage
1. Create a new material in your Unity project.
2. Assign the HDRP Toon Shader to the material.
3. Apply the material to your 3D models.
4. Adjust the shader parameters in the material inspector to achieve the desired look.
## Examples
Here are some examples of the HDRP Toon Shader in action:
![Example 1](ReadmeAssets/preview-01.png)
## Contributing
If you would like to contribute to the development of the HDRP Toon Shader, please follow these steps:
1. Fork the repository.
2. Create a new branch for your feature or bugfix.
3. Commit your changes and push them to your fork.
4. Create a pull request with a description of your changes.
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.

View File

@@ -9,7 +9,6 @@ namespace Unity.Toonshader
public struct UTSOutlineSetting
{
public bool enable;
public RenderingLayerMask renderingLayer;
}
[Serializable]
@@ -23,7 +22,8 @@ namespace Unity.Toonshader
public class UTSRenderPassSettings : ScriptableObject
{
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 UtsHairShadowSetting hairShadowSetting;
@@ -37,21 +37,22 @@ namespace Unity.Toonshader
}
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
{
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;
#else
return Resources.Load<UTSRenderPassSettings>(Path.GetFileNameWithoutExtension(UTS_Rendering_Settings_Path));
return Resources.Load<UTSRenderPassSettings>(UTS_RENDERING_SETTINGS_RESOURCES_PATH);
#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] _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
[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] _ZTestModeDistortion("_ZTestModeDistortion", Int) = 8
[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

@@ -917,8 +917,12 @@ void Frag(PackedVaryingsToPS packedInput,
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.
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.
// Then sample the hair buffer, to see if the fragment lands in shadow.
float4 hairBuffer = SAMPLE_TEXTURE2D(_HairShadowTex, s_trilinear_clamp_sampler, samplingPoint);
float hairDepth = hairBuffer.r;
@@ -967,14 +971,13 @@ void Frag(PackedVaryingsToPS packedInput,
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
if(cDepth - mDepth > 0.02) discard; // Manual Depth Test.
if(cDepth - mDepth > 0.02) // Manual Depth Test
{
discard;
}
// _EyeBrowBlendingFactor
outColor.a = _EyeBrowBlendingFactor;
outColor.a = hairPixel > 0.01 ? outColor.a : 1 ;
//outColor.rgb = float3(hDepth.rg * 5,0);
#endif
#if defined(UTS_DEBUG_SHADOWMAP) || defined(UTS_DEBUG_SELFSHADOW)

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));
float3 _Is_LightColor_RimLight_var = lerp(_RimLightColor.rgb, (_RimLightColor.rgb * Set_LightColor), _Is_LightColor_RimLight);
float _RimArea_var = dot(utsData.normalDirection, utsData.viewDirection);
if(_Is_BlendAddToRimColor == 1)
{
_RimArea_var = 1 - _RimArea_var;
}
_RimArea_var = lerp(_RimArea_var, 1 - _RimArea_var,_Is_BlendAddToRimColor);
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 _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));
Set_RimLight *= _RimLightVisible;
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);
if (any(Set_RimLight) * maskRimEnabled)
{
@@ -317,16 +308,8 @@ void UTS_MainLight(LightLoopContext lightLoopContext, FragInputs input, UTSLight
#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));
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);
#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));
float3 _Is_LightColor_RimLight_var = lerp(_RimLightColor.rgb, (_RimLightColor.rgb * Set_LightColor), _Is_LightColor_RimLight);
float _RimArea_var = dot(surfaceData.normalWS, V);
if (_Is_BlendAddToRimColor == 1)
{
_RimArea_var = 1 - _RimArea_var;
}
_RimArea_var = lerp(_RimArea_var, 1 - _RimArea_var, _Is_BlendAddToRimColor);
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 _VertHalfLambert_var = 0.5 * dot(surfaceData.normalWS, lightDirection) + 0.5;
@@ -187,14 +185,6 @@ 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));
Set_RimLight *= _RimLightVisible;
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)
{
@@ -216,21 +206,17 @@ void UTS_OtherLights(LightLoopContext lightLoopContext, FragInputs input, UTSLig
channelOutAlpha = _HighlightVisible;
}
// Rim light
diffuseTerm = lerp(lerp(diffuseTerm, (diffuseTerm * Set_RimLight), _RimLight), lerp(diffuseTerm, (diffuseTerm + Set_RimLight), _RimLight), _Is_BlendAddToRimColor);
#else
_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));
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);
// Rim light
diffuseTerm = lerp(lerp(diffuseTerm, (diffuseTerm * Set_RimLight), _RimLight), lerp(diffuseTerm, (diffuseTerm + Set_RimLight), _RimLight), _Is_BlendAddToRimColor);
#endif
// PBR----------------------------------------------------------------------------------------------------------------

View File

@@ -24,7 +24,7 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{
_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);
}
@@ -54,13 +54,13 @@ public class UTSHairShadowPass : DrawRenderersCustomPass
var mask = RenderStateMask.Nothing;
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)
{
renderQueueRange = GetRenderQueueRange(renderQueueType),
sortingCriteria = sortingCriteria,
renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
sortingCriteria = SortingCriteria.CommonOpaque,
excludeObjectMotionVectors = false,
stateBlock = stateBlock,
renderingLayerMask = renderingLayerMask,

View File

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

View File

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

View File

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