//Unity Toon Shader/HDRP //nobuyuki@unity3d.com //toshiyuki@unity3d.com (Universal RP/HDRP) #include "PBR.hlsl" void UTS_OtherLights(LightLoopContext lightLoopContext, FragInputs input, UTSLightData utsLightData, SurfaceData surfaceData, BSDFData bsdfData, int lightType, float3 i_normalDir, float notDirectional, out float channelOutAlpha, inout UTSAggregateLighting utsAggregateLighting) { channelOutAlpha = 1.0f; // We dont have to calculate lighting here if we are using sdf shadow #ifndef _SDFShadow #ifdef _IS_CLIPPING_MATTE if (_ClippingMatteMode != 0) { return float3(0.0f, 0.0f, 0.0f); } #endif // _IS_CLIPPING_MATTE uint2 tileIndex = uint2(input.positionSS.xy) / GetTileSize(); // input.positionSS is SV_Position PositionInputs posInput = GetPositionInput(input.positionSS.xy, _ScreenSize.zw, input.positionSS.z, input.positionSS.w, input.positionRWS.xyz, tileIndex); /* todo. these should be put into struct */ #ifdef VARYINGS_NEED_POSITION_WS float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); #else // Unused float3 V = float3(1.0, 1.0, 1.0); // Avoid the division by 0 #endif float3 lightDirection = utsLightData.lightDirection; float3 additionalLightColor = utsLightData.lightColor * _Light_Intensity_Multiplier; PreLightData preLightData = GetPreLightData(V, posInput, bsdfData); float4 Set_UV0 = input.texCoord0; float3x3 tangentTransform = input.tangentToWorld; //UnpackNormalmapRGorAG(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, texCoords)) float3 normalDirection = surfaceData.normalWS; // Perturbed normals float3 viewDirection = V; float4 _MainTex_var = float4(surfaceData.baseColor.r, surfaceData.baseColor.g, surfaceData.baseColor.b, surfaceData.coatMask); /* end of todo.*/ SHADOW_TYPE shadowAttenuation = lightLoopContext.shadowValue; #if !defined (UTS_USE_RAYTRACING_SHADOW) shadowAttenuation *= 2.0f; shadowAttenuation = saturate(shadowAttenuation); #endif //v.2.0.5: float3 addPassLightColor; if (lightType == GPULIGHTTYPE_TUBE) { addPassLightColor = (0.5f * (preLightData.diffuseFGD * utsLightData.diffuseDimmer) + 0.5f) / PI * additionalLightColor.rgb; } else if (lightType == GPULIGHTTYPE_RECTANGLE) { addPassLightColor = ((preLightData.diffuseFGD * utsLightData.diffuseDimmer)) * additionalLightColor.rgb; } else { addPassLightColor = (0.5f * dot(lerp(i_normalDir, normalDirection, _Is_NormalMapToBase), lightDirection) + 0.5f) * additionalLightColor.rgb ; } float pureIntencity = max(0.001, (0.299 * additionalLightColor.r + 0.587 * additionalLightColor.g + 0.114 * additionalLightColor.b)); float3 lightColor = max(float3(0.0, 0.0, 0.0), lerp(addPassLightColor, lerp(float3(0.0, 0.0, 0.0), min(addPassLightColor, addPassLightColor / pureIntencity), notDirectional), _Is_Filter_LightColor)); float3 halfDirection = normalize(viewDirection + lightDirection); // has to be recalced here. //v.2.0.5: //v.2.0.5: _1st_ShadeColor_Step = saturate(_1st_ShadeColor_Step + _StepOffset); _2nd_ShadeColor_Step = saturate(_2nd_ShadeColor_Step + _StepOffset); // //v.2.0.5: If Added lights is directional, set 0 as _LightIntensity float _LightIntensity = lerp(0, (0.299 * additionalLightColor.r + 0.587 * additionalLightColor.g + 0.114 * additionalLightColor.b), notDirectional); //v.2.0.5: Filtering the high intensity zone of PointLights float3 Set_LightColor = lightColor; // float3 Set_BaseColor = lerp((_BaseColor.rgb * _MainTex_var.rgb * _LightIntensity), ((_BaseColor.rgb * _MainTex_var.rgb) * Set_LightColor), _Is_LightColor_Base); #ifdef UTS_LAYER_VISIBILITY float Set_BaseColorAlpha = _BaseColorVisible; float4 overridingColor = lerp(_BaseColorMaskColor, float4(_BaseColorMaskColor.w, _BaseColorMaskColor.w, _BaseColorMaskColor.w, 1.0f), _ComposerMaskMode); float maskEnabled = max(_BaseColorOverridden, _ComposerMaskMode); Set_BaseColor = lerp(Set_BaseColor, overridingColor, maskEnabled); Set_BaseColor *= _BaseColorVisible; #endif //#ifdef UTS_LAYER_VISIBILITY //v.2.0.5 float4 _1st_ShadeMap_var = lerp(SAMPLE_TEXTURE2D(_1st_ShadeMap, sampler_BaseColorMap, TRANSFORM_TEX(Set_UV0, _1st_ShadeMap)), _MainTex_var, _Use_BaseAs1st); float3 Set_1st_ShadeColor = lerp((_1st_ShadeColor.rgb * _1st_ShadeMap_var.rgb * _LightIntensity), ((_1st_ShadeColor.rgb * _1st_ShadeMap_var.rgb) * Set_LightColor), _Is_LightColor_1st_Shade); #ifdef UTS_LAYER_VISIBILITY { float4 overridingColor = lerp(_FirstShadeMaskColor, float4(_FirstShadeMaskColor.w, _FirstShadeMaskColor.w, _FirstShadeMaskColor.w, 1.0f), _ComposerMaskMode); float maskEnabled = max(_FirstShadeOverridden, _ComposerMaskMode); Set_1st_ShadeColor = lerp(Set_1st_ShadeColor, overridingColor, maskEnabled); Set_1st_ShadeColor = lerp(Set_1st_ShadeColor, Set_BaseColor, 1.0f - _FirstShadeVisible); } float Set_1st_ShadeAlpha = _FirstShadeVisible; #endif //#ifdef UTS_LAYER_VISIBILITY //v.2.0.5 //v.2.0.5 float4 _2nd_ShadeMap_var = lerp(SAMPLE_TEXTURE2D(_2nd_ShadeMap, sampler_BaseColorMap, TRANSFORM_TEX(Set_UV0, _2nd_ShadeMap)), _1st_ShadeMap_var, _Use_1stAs2nd); float3 Set_2nd_ShadeColor = lerp((_2nd_ShadeColor.rgb * _2nd_ShadeMap_var.rgb * _LightIntensity), ((_2nd_ShadeColor.rgb * _2nd_ShadeMap_var.rgb) * Set_LightColor), _Is_LightColor_2nd_Shade); #ifdef UTS_LAYER_VISIBILITY { float4 overridingColor = lerp(_SecondShadeMaskColor, float4(_SecondShadeMaskColor.w, _SecondShadeMaskColor.w, _SecondShadeMaskColor.w, 1.0f), _ComposerMaskMode); float maskEnabled = max(_SecondShadeOverridden, _ComposerMaskMode); Set_2nd_ShadeColor = lerp(Set_2nd_ShadeColor, overridingColor, maskEnabled); Set_2nd_ShadeColor = lerp(Set_2nd_ShadeColor, Set_BaseColor, 1.0f - _SecondShadeVisible); } #endif //#ifdef UTS_LAYER_VISIBILITY float _HalfLambert_var = 0.5 * dot(lerp(i_normalDir, normalDirection, _Is_NormalMapToBase), lightDirection) + 0.5; // //v.2.0.5: //SGM //v.2.0.6 float4 _ShadingGradeMap_var = tex2Dlod(_ShadingGradeMap, float4(TRANSFORM_TEX(Set_UV0, _ShadingGradeMap), 0.0, _BlurLevelSGM)); //v.2.0.6 //Minmimum value is same as the Minimum Feather's value with the Minimum Step's value as threshold. float _SystemShadowsLevel_var = (shadowAttenuation*0.5)+0.5+_Tweak_SystemShadowsLevel > 0.001 ? (shadowAttenuation*0.5)+0.5+_Tweak_SystemShadowsLevel : 0.0001; float _ShadingGradeMapLevel_var = _ShadingGradeMap_var.r < 0.95 ? _ShadingGradeMap_var.r + _Tweak_ShadingGradeMapLevel : 1; float Set_ShadingGrade = saturate(_ShadingGradeMapLevel_var)*lerp( _HalfLambert_var, (_HalfLambert_var*saturate(_SystemShadowsLevel_var)), _Set_SystemShadowsToBase ); //float Set_ShadingGrade = saturate(_ShadingGradeMapLevel_var) * lerp(_HalfLambert_var, (_HalfLambert_var * saturate(1.0 + _Tweak_SystemShadowsLevel)), _Set_SystemShadowsToBase); float _1stColorFeatherForMask = lerp(_1st_ShadeColor_Feather, 0.0f, max(_FirstShadeOverridden, _ComposerMaskMode)); float _2ndColorFeatherForMask = lerp(_2nd_ShadeColor_Feather, 0.0f, max(_SecondShadeOverridden, _ComposerMaskMode)); // float Set_FinalShadowMask = saturate((1.0 + ((Set_ShadingGrade - (_1st_ShadeColor_Step - _1stColorFeatherForMask)) * (0.0 - 1.0)) / (_1st_ShadeColor_Step - (_1st_ShadeColor_Step - _1stColorFeatherForMask)))); float Set_ShadeShadowMask = saturate((1.0 + ((Set_ShadingGrade - (_2nd_ShadeColor_Step - _2ndColorFeatherForMask)) * (0.0 - 1.0)) / (_2nd_ShadeColor_Step - (_2nd_ShadeColor_Step - _2ndColorFeatherForMask)))); // 1st and 2nd Shades Mask //SGM //Composition: 3 Basic Colors as diffuseTerm float3 diffuseTerm = lerp( Set_BaseColor, lerp( Set_1st_ShadeColor, Set_2nd_ShadeColor, Set_ShadeShadowMask ), Set_FinalShadowMask); #ifdef UTS_LAYER_VISIBILITY float Set_2nd_ShadeAlpha = _SecondShadeVisible; channelOutAlpha = lerp(Set_BaseColorAlpha, lerp(Set_1st_ShadeAlpha, Set_2nd_ShadeAlpha, Set_ShadeShadowMask), Set_FinalShadowMask); #endif //v.2.0.6: Add HighColor if _Is_Filter_HiCutPointLightColor is False float4 _Set_HighColorMask_var = tex2D(_Set_HighColorMask, TRANSFORM_TEX(Set_UV0, _Set_HighColorMask)); float _Specular_var = 0.5 * dot(halfDirection, lerp(i_normalDir, normalDirection, _Is_NormalMapToHighColor)) + 0.5; // Specular float _TweakHighColorMask_var = (saturate((_Set_HighColorMask_var.g + _Tweak_HighColorMaskLevel)) * lerp((1.0 - step(_Specular_var, (1.0 - pow(_HighColor_Power, 5)))), pow(_Specular_var, exp2(lerp(11, 1, _HighColor_Power))), _Is_SpecularToHighColor)); float4 _HighColor_Tex_var = tex2D(_HighColor_Tex, TRANSFORM_TEX(Set_UV0, _HighColor_Tex)); float3 _HighColor_var = lerp((_HighColor_Tex_var.rgb * _HighColor.rgb), ((_HighColor_Tex_var.rgb * _HighColor.rgb) * Set_LightColor), _Is_LightColor_HighColor); 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; } 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; float3 _LightDirection_MaskOn_var = lerp((_Is_LightColor_RimLight_var * _Rimlight_InsideMask_var), (_Is_LightColor_RimLight_var * saturate((_Rimlight_InsideMask_var - ((1.0 - _VertHalfLambert_var) + _Tweak_LightDirection_MaskLevel)))), _LightDirection_MaskOn); float _ApRimLightPower_var = pow(_RimArea_var, exp2(lerp(3, 0, _Ap_RimLight_Power))); //Composition: HighColor and RimLight as _RimLight_var #ifdef UTS_LAYER_VISIBILITY float4 overrideColor = lerp(_HighlightMaskColor, float4(_HighlightMaskColor.w, _HighlightMaskColor.w, _HighlightMaskColor.w, 1.0f), _ComposerMaskMode); float isMaskEnabled = max(_HighlightOverridden, _ComposerMaskMode); _HighColor_var *= _TweakHighColorMask_var; _HighColor_var *= _HighlightVisible; float4 overridingRimColor = lerp(_RimLightMaskColor, float4(_RimLightMaskColor.w, _RimLightMaskColor.w, _RimLightMaskColor.w, 1.0f), _ComposerMaskMode); float maskRimEnabled = max(_RimLightOverridden, _ComposerMaskMode); float Set_RimLightAlpha = _RimLightVisible; 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) { _HighColor_var = overridingRimColor; channelOutAlpha = Set_RimLightAlpha; } diffuseTerm = lerp(saturate(diffuseTerm - _TweakHighColorMask_var), diffuseTerm, lerp(_Is_BlendAddToHiColor, 1.0 , _Is_SpecularToHighColor)); float3 addColor = lerp(_HighColor_var, (_HighColor_var * ((1.0 - Set_FinalShadowMask) + (Set_FinalShadowMask * _TweakHighColorOnShadow))) , _Is_UseTweakHighColorOnShadow); diffuseTerm += addColor; if (any(addColor)) { diffuseTerm = lerp(diffuseTerm, overrideColor, isMaskEnabled); channelOutAlpha = _HighlightVisible; } #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); #endif // PBR---------------------------------------------------------------------------------------------------------------- float albedoIntensity = max(0.1, (1 - sqrt(surfaceData.metallic)) * (1.7 - 0.7 * (1 - sqrt(surfaceData.metallic)))); //Specular Term float3 specularTerm = 0; if(lightType == GPULIGHTTYPE_RECTANGLE || lightType == GPULIGHTTYPE_TUBE) { specularTerm = preLightData.specularFGD * Set_LightColor * utsLightData.specularDimmer; #ifdef _PBR_Mode_TOON specularTerm = StepFeatherToon(specularTerm, _ToonSpecularStep, _ToonSpecularFeather); #endif } else { specularTerm = ComputeSpecularTerm(V, lightDirection, bsdfData) * Set_LightColor * utsLightData.specularDimmer; } specularTerm = specularTerm * (1.0 - Set_FinalShadowMask) * PI * surfaceData.specularColor; diffuseTerm = diffuseTerm * albedoIntensity; utsAggregateLighting.directDiffuse += diffuseTerm; utsAggregateLighting.directSpecular += specularTerm; #endif // _SDFShadow }