diff --git a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/AssetCallbacks/CreateDefaultShaderGraph.cs b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/AssetCallbacks/CreateDefaultShaderGraph.cs index 8acab4f1..18363f1c 100644 --- a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/AssetCallbacks/CreateDefaultShaderGraph.cs +++ b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/AssetCallbacks/CreateDefaultShaderGraph.cs @@ -29,6 +29,7 @@ public static void CreateLitGraph() ToonBlockFields.SurfaceDescription.GlobalRampUV, ToonBlockFields.SurfaceDescription.ShadowColor, ToonBlockFields.SurfaceDescription.DiffuseOffset, + ToonBlockFields.SurfaceDescription.MainLightOcclusion, ToonBlockFields.SurfaceDescription.ShadowReceivePositionOffset, ToonBlockFields.SurfaceDescription.SpecularColor, ToonBlockFields.SurfaceDescription.SpecularSizeOffset, diff --git a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/DefaultPass.hlsl b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/DefaultPass.hlsl index 1b6361cb..2d8ecbb4 100644 --- a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/DefaultPass.hlsl +++ b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/DefaultPass.hlsl @@ -50,6 +50,7 @@ float4 PS(PackedVaryings packedInput) : SV_TARGET lightComputationParameters.albedo = albedo; lightComputationParameters.shadowColor = surfaceDescription.ShadowColor; lightComputationParameters.diffuseOffset = surfaceDescription.DiffuseOffset; + lightComputationParameters.mainLightOcclusion = surfaceDescription.MainLightOcclusion; lightComputationParameters.shadowReceivePositionOffset = surfaceDescription.ShadowReceivePositionOffset; #if _TOON_LIGHTING_SPECULAR diff --git a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/Varyings.hlsl b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/Varyings.hlsl index cbba5e3b..4a57f569 100644 --- a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/Varyings.hlsl +++ b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Includes/Varyings.hlsl @@ -173,8 +173,6 @@ Varyings BuildVaryings(Attributes input, out VertexDescription vertexDescription #if _FORCE_DISABLE_FOG fogFactor = 1.0; #endif // _FORCE_DISABLE_FOG - - #ifdef _TOON_RP_ADDITIONAL_LIGHTS_VERTEX LightComputationParameters lightComputationParameters = (LightComputationParameters) 0; diff --git a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Targets/ToonDefaultSubTarget.cs b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Targets/ToonDefaultSubTarget.cs index 314c545b..e6d3edd2 100644 --- a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Targets/ToonDefaultSubTarget.cs +++ b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/Targets/ToonDefaultSubTarget.cs @@ -110,6 +110,7 @@ public override void GetActiveBlocks(ref TargetActiveBlockContext context) context.AddBlock(ToonBlockFields.SurfaceDescription.GlobalRampUV, !OverrideRamp); context.AddBlock(ToonBlockFields.SurfaceDescription.ShadowColor); context.AddBlock(ToonBlockFields.SurfaceDescription.DiffuseOffset); + context.AddBlock(ToonBlockFields.SurfaceDescription.MainLightOcclusion); context.AddBlock(ToonBlockFields.SurfaceDescription.ShadowReceivePositionOffset); } @@ -413,6 +414,7 @@ private static class DefaultBlockMasks ToonBlockFields.SurfaceDescription.GlobalRampUV, ToonBlockFields.SurfaceDescription.ShadowColor, ToonBlockFields.SurfaceDescription.DiffuseOffset, + ToonBlockFields.SurfaceDescription.MainLightOcclusion, ToonBlockFields.SurfaceDescription.ShadowReceivePositionOffset, ToonBlockFields.SurfaceDescription.OverrideRampThreshold, diff --git a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/ToonBlockFields.cs b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/ToonBlockFields.cs index 4e310d35..2cf9ea16 100644 --- a/Packages/com.deltation.toon-rp/Editor/ShaderGraph/ToonBlockFields.cs +++ b/Packages/com.deltation.toon-rp/Editor/ShaderGraph/ToonBlockFields.cs @@ -103,6 +103,13 @@ public struct SurfaceDescription "SURFACEDESCRIPTION_DIFFUSEOFFSET", new FloatControl(0.0f), ShaderStage.Fragment ); + + public static readonly BlockFieldDescriptor MainLightOcclusion = new(Name, "MainLightOcclusion", + "Main Light Occlusion", + "SURFACEDESCRIPTION_MAINLIGHTOCCLUSION", + new FloatControl(1.0f), ShaderStage.Fragment + ); + public static readonly BlockFieldDescriptor ShadowReceivePositionOffset = new(Name, "ShadowReceivePositionOffset", "Shadow Receive Position Offset", diff --git a/Packages/com.deltation.toon-rp/ShaderLibrary/MainLightShadowAttenuationShaderGraph.hlsl b/Packages/com.deltation.toon-rp/ShaderLibrary/MainLightShadowAttenuationShaderGraph.hlsl index 8ac904f0..ca962757 100644 --- a/Packages/com.deltation.toon-rp/ShaderLibrary/MainLightShadowAttenuationShaderGraph.hlsl +++ b/Packages/com.deltation.toon-rp/ShaderLibrary/MainLightShadowAttenuationShaderGraph.hlsl @@ -8,6 +8,7 @@ void GetMainLightShadowAttenuation_float( const float3 positionWs, const float3 shadowReceivePositionOffset, + const float occlusion, out float shadowAttenuation ) { @@ -34,7 +35,7 @@ void GetMainLightShadowAttenuation_float( LightComputationParameters parameters = (LightComputationParameters) 0; parameters.positionWs = positionWs; - shadowAttenuation = ApplyShadowRampAndPattern(parameters, light.shadowAttenuation); + shadowAttenuation = ApplyShadowRampAndPattern(parameters, light.shadowAttenuation * occlusion); #else // !_TOON_RP_ANY_SHADOWS diff --git a/Packages/com.deltation.toon-rp/ShaderLibrary/Toon RP Main Light Shadow Attenuation SubGraph.shadersubgraph b/Packages/com.deltation.toon-rp/ShaderLibrary/Toon RP Main Light Shadow Attenuation SubGraph.shadersubgraph index 83a6d1ea..d0af5238 100644 --- a/Packages/com.deltation.toon-rp/ShaderLibrary/Toon RP Main Light Shadow Attenuation SubGraph.shadersubgraph +++ b/Packages/com.deltation.toon-rp/ShaderLibrary/Toon RP Main Light Shadow Attenuation SubGraph.shadersubgraph @@ -8,6 +8,9 @@ }, { "m_Id": "7f06ae553af6490eb96cf2ca255010ae" + }, + { + "m_Id": "d417e61b56474840a87a7745e3c4975e" } ], "m_Keywords": [], @@ -29,6 +32,9 @@ }, { "m_Id": "0d4ba147c7f443089ae2cd2598b301c4" + }, + { + "m_Id": "61872d375f664550923019390c59af18" } ], "m_GroupDatas": [], @@ -62,6 +68,20 @@ "m_SlotId": 1 } }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "61872d375f664550923019390c59af18" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "af9c250353a24ab5a901970e4607b021" + }, + "m_SlotId": 3 + } + }, { "m_OutputSlot": { "m_Node": { @@ -134,10 +154,10 @@ "m_Expanded": true, "m_Position": { "serializedVersion": "2", - "x": -739.9999389648438, - "y": 0.000002384185791015625, - "width": 136.0, - "height": 34.0 + "x": -698.0, + "y": -0.00001049041748046875, + "width": 136.00006103515626, + "height": 34.0000114440918 } }, "m_Slots": [ @@ -170,10 +190,10 @@ "m_Expanded": true, "m_Position": { "serializedVersion": "2", - "x": -839.0, - "y": 97.00000762939453, - "width": 235.00006103515626, - "height": 33.999977111816409 + "x": -805.9999389648438, + "y": 60.0000114440918, + "width": 235.0, + "height": 33.99996566772461 } }, "m_Slots": [ @@ -205,10 +225,28 @@ }, { "m_Id": "7f06ae553af6490eb96cf2ca255010ae" + }, + { + "m_Id": "d417e61b56474840a87a7745e3c4975e" } ] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1c0fd80c5a58409ea392436ae5a7335b", + "m_Id": 0, + "m_DisplayName": "Occlusion", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", @@ -232,6 +270,42 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "61872d375f664550923019390c59af18", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -698.0, + "y": 119.99998474121094, + "width": 127.00006103515625, + "height": 34.00001525878906 + } + }, + "m_Slots": [ + { + "m_Id": "1c0fd80c5a58409ea392436ae5a7335b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "d417e61b56474840a87a7745e3c4975e" + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", @@ -385,6 +459,9 @@ { "m_Id": "e1544fb9c25e43d1af59028f50cf9c0d" }, + { + "m_Id": "eea609025d73437e8a1e91a85ae64516" + }, { "m_Id": "01f6e374008f4c3f8b5575a8b2e4e634" } @@ -429,6 +506,34 @@ "m_Labels": [] } +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "d417e61b56474840a87a7745e3c4975e", + "m_Guid": { + "m_GuidSerialized": "6e904b14-0155-414c-b688-f1ee625b6bca" + }, + "m_Name": "Occlusion", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Occlusion", + "m_DefaultReferenceName": "_Occlusion", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 1.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", @@ -452,3 +557,18 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "eea609025d73437e8a1e91a85ae64516", + "m_Id": 3, + "m_DisplayName": "occlusion", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "occlusion", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + diff --git a/Packages/com.deltation.toon-rp/ShaderLibrary/ToonLighting.hlsl b/Packages/com.deltation.toon-rp/ShaderLibrary/ToonLighting.hlsl index a05fbab9..f46dbe42 100644 --- a/Packages/com.deltation.toon-rp/ShaderLibrary/ToonLighting.hlsl +++ b/Packages/com.deltation.toon-rp/ShaderLibrary/ToonLighting.hlsl @@ -28,6 +28,7 @@ struct LightComputationParameters float4 albedo; float4 shadowColor; float diffuseOffset; + float mainLightOcclusion; float3 shadowReceivePositionOffset; float3 specularColor; float specularSizeOffset; @@ -101,11 +102,11 @@ float ApplyShadowRampAndPattern(const LightComputationParameters parameters, flo float GetShadowAttenuation(const LightComputationParameters parameters, const Light light) { #if defined(_TOON_RP_BLOB_SHADOWS) && !defined(_RECEIVE_BLOB_SHADOWS) - return 1.0f; + return parameters.mainLightOcclusion == 1.0f ? 1.0f : ApplyShadowRampAndPattern(parameters, parameters.mainLightOcclusion); #endif // _TOON_RP_BLOB_SHADOWS && _RECEIVE_BLOB_SHADOWS #if defined(_TOON_RP_ANY_SHADOWS) - return ApplyShadowRampAndPattern(parameters, light.shadowAttenuation); + return ApplyShadowRampAndPattern(parameters, light.shadowAttenuation * parameters.mainLightOcclusion); #else // !_TOON_RP_ANY_SHADOWS return 1.0f; #endif // _TOON_RP_ANY_SHADOWS diff --git a/Packages/com.deltation.toon-rp/Shaders/ToonRPDefaultLitOutput.hlsl b/Packages/com.deltation.toon-rp/Shaders/ToonRPDefaultLitOutput.hlsl index 7b47c422..a21c51fc 100644 --- a/Packages/com.deltation.toon-rp/Shaders/ToonRPDefaultLitOutput.hlsl +++ b/Packages/com.deltation.toon-rp/Shaders/ToonRPDefaultLitOutput.hlsl @@ -25,6 +25,7 @@ float3 ComputeLitOutputColor(const v2f IN, const float4 albedo) lightComputationParameters.globalRampUv = IN.uv; lightComputationParameters.albedo = albedo; lightComputationParameters.shadowColor = _ShadowColor; + lightComputationParameters.mainLightOcclusion = 1; #ifdef _TOON_LIGHTING_SPECULAR lightComputationParameters.specularSizeOffset = _SpecularSizeOffset; lightComputationParameters.specularColor = _SpecularColor;