10 Commits

Author SHA1 Message Date
Misaki
23862b4380 Merge branch 'main' of https://git.personalnas.com/Misaki/com.misaki.hdrp-toon 2024-12-26 16:17:27 +09:00
Misaki
1d2a815803 Merge branch 'main' of https://git.personalnas.com/Misaki/com.misaki.hdrp-toon 2024-12-26 16:17:22 +09:00
Misaki
e91a602add Merge branch 'main' of https://git.personalnas.com/Misaki/com.misaki.hdrp-toon 2024-12-26 16:14:49 +09:00
Misaki
eda516fdab Fixed README assets missing; 2024-12-26 16:14:36 +09:00
Misaki
d33d3f2bb7 Fixed README assets missing; 2024-12-26 16:13:19 +09:00
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
20 changed files with 401 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 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

@@ -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

@@ -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:
![preview-01.png](https://s2.loli.net/2024/12/26/zHdfSXho4csURyx.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.

BIN
ReadmeAssets/preview-01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

View File

@@ -0,0 +1,117 @@
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:

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);
@@ -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
{
discard;
}
// _EyeBrowBlendingFactor
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,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)); 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)
{ {
@@ -216,21 +206,17 @@ void UTS_OtherLights(LightLoopContext lightLoopContext, FragInputs input, UTSLig
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.4",
"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",