//Unity Toon Shader/HDRP //nobuyuki@unity3d.com //toshiyuki@unity3d.com (Universal RP/HDRP) #undef unity_ObjectToWorld #undef unity_WorldToObject float4 _LightColor0; // not referenced in c# code ?? #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/MotionVectorVertexShaderCommon.hlsl" // PackedVaryingsType // https://github.com/Unity-Technologies/Graphics/blob/e4117c07b479adafed38237f3407a363eefb4590/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/VertMesh.hlsl#L120 PackedVaryingsType Vert(AttributesMesh inputMesh, AttributesPass inputPass) { // VaryingsType // https://github.com/Unity-Technologies/Graphics/blob/e4117c07b479adafed38237f3407a363eefb4590/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/VertMesh.hlsl#L118 VaryingsType varyingsType; varyingsType.vmesh = VertMesh(inputMesh); varyingsType.vmesh. #include "HDRPToonOutlineVertMain.hlsl" return MotionVectorVS(varyingsType, inputMesh, inputPass); } #ifdef TESSELLATION_ON PackedVaryingsToPS VertTesselation(VaryingsToDS input) { VaryingsToPS output; output.vmesh = VertMeshTesselation(input.vmesh); MotionVectorPositionZBias(output); output.vpass.positionCS = input.vpass.positionCS; output.vpass.previousPositionCS = input.vpass.previousPositionCS; return PackVaryingsToPS(output); } #endif // TESSELLATION_ON #else // _WRITE_TRANSPARENT_MOTION_VECTOR #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/VertMesh.hlsl" PackedVaryingsType Vert(AttributesMesh inputMesh) { VaryingsType varyingsType; varyingsType.vmesh = VertMesh(inputMesh); #include "HDRPToonOutlineVertMain.hlsl" return PackVaryingsType(varyingsType); } #ifdef TESSELLATION_ON PackedVaryingsToPS VertTesselation(VaryingsToDS input) { VaryingsToPS output; output.vmesh = VertMeshTesselation(input.vmesh); return PackVaryingsToPS(output); } #endif // TESSELLATION_ON #endif // _WRITE_TRANSPARENT_MOTION_VECTOR #ifdef TESSELLATION_ON #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/TessellationShare.hlsl" #endif #ifdef UNITY_VIRTUAL_TEXTURING #define VT_BUFFER_TARGET SV_Target1 #define EXTRA_BUFFER_TARGET SV_Target2 #else #define EXTRA_BUFFER_TARGET SV_Target1 #endif void Frag(PackedVaryingsToPS packedInput, #ifdef OUTPUT_SPLIT_LIGHTING out float4 outColor : SV_Target0, // outSpecularLighting #ifdef UNITY_VIRTUAL_TEXTURING out float4 outVTFeedback : VT_BUFFER_TARGET, #endif out float4 outDiffuseLighting : EXTRA_BUFFER_TARGET, OUTPUT_SSSBUFFER(outSSSBuffer) #else out float4 outColor : SV_Target0 #ifdef UNITY_VIRTUAL_TEXTURING , out float4 outVTFeedback : VT_BUFFER_TARGET #endif #ifdef _WRITE_TRANSPARENT_MOTION_VECTOR , out float4 outMotionVec : EXTRA_BUFFER_TARGET #endif // _WRITE_TRANSPARENT_MOTION_VECTOR #endif // OUTPUT_SPLIT_LIGHTING #ifdef _DEPTHOFFSET_ON , out float outputDepth : SV_Depth #endif ) { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(packedInput); FragInputs input = UnpackVaryingsMeshToFragInputs(packedInput.vmesh); #ifdef _IS_CLIPPING_MASK if (_ClippingMaskMode != 0) { discard; } #endif #ifdef _IS_CLIPPING_MATTE if (_ClippingMatteMode != 0) { discard; } #endif // _IS_CLIPPING_MATTE #if defined(UTS_DEBUG_SHADOWMAP_NO_OUTLINE) discard; #endif //v.2.0.5 if (_ZOverDrawMode > 0.99f) { #ifdef _DEPTHOFFSET_ON outputDepth = posInput.deviceDepth; #endif #ifdef UNITY_VIRTUAL_TEXTURING outVTFeedback = builtinData.vtPackedFeedback; #endif outColor = float4(1.0f, 1.0f, 1.0f, 1.0f); // but nothing should be drawn except Z value as colormask is set to 0 return; } _Color = _BaseColor; float4 objPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)); float4 Set_UV0 = input.texCoord0; // The following temporary definition of unity_AmbientEquator is for HDRP only. //float4 unity_AmbientEquator = float4(0.05, 0.05, 0.05, 1.0); //Todo. //v.2.0.9 //float3 envLightSource_GradientEquator = unity_AmbientEquator.rgb > 0.05 ? unity_AmbientEquator.rgb : half3(0.05, 0.05, 0.05); float3 envLightSource_GradientEquator = ShadeSH9(float4(0, 1, 0, 0)); float3 envLightSource_SkyboxIntensity = max( SampleBakedGI_UTS_OutLine(objPos.xyz, float3(0.0, 0.0, 0.0), input.texCoord1.xy, input.texCoord2.xy), SampleBakedGI_UTS_OutLine(objPos.xyz, float3(0.0, -1.0, 0.0), input.texCoord1.xy, input.texCoord2.xy) ).rgb; float3 ambientSkyColor = envLightSource_SkyboxIntensity.rgb > 0.0 ? envLightSource_SkyboxIntensity : envLightSource_GradientEquator; ambientSkyColor *= GetCurrentExposureMultiplier() * 5.0f; float4 _MainTex_var = SAMPLE_TEXTURE2D(_BaseColorMap, sampler_BaseColorMap, TRANSFORM_TEX(Set_UV0, _MainTex)); float3 Set_BaseColor = _BaseColor.rgb*_MainTex_var.rgb; float3 _Is_BlendBaseColor_var = lerp(_Outline_Color.rgb * ambientSkyColor, (_Outline_Color.rgb * ambientSkyColor * Set_BaseColor * Set_BaseColor), _Is_BlendBaseColor); // float3 _OutlineTex_var = tex2D(_OutlineTex,TRANSFORM_TEX(Set_UV0, _OutlineTex)).xyz; float4 overridingColor = lerp(_OutlineMaskColor, float4(_OutlineMaskColor.w, _OutlineMaskColor.w, _OutlineMaskColor.w, 1.0f), _ComposerMaskMode); float maskEnabled = max(_OutlineOverridden, _ComposerMaskMode); //v.2.0.7.5 #ifdef _IS_OUTLINE_CLIPPING_NO float3 Set_Outline_Color = lerp(_Is_BlendBaseColor_var, _OutlineTex_var.rgb*_Outline_Color.rgb * ambientSkyColor, _Is_OutlineTex ); if (_OutlineVisible < 0.1) { // Todo. // without this, something is drawn even if _OutlineVisible = 0, in AngelRing(HDRP) discard; } Set_Outline_Color = lerp(Set_Outline_Color, overridingColor.xyz, maskEnabled); float3 volColor, volOpacity; 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); float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); EvaluateAtmosphericScattering(posInput, V, volColor, volOpacity); // Premultiplied alpha Set_Outline_Color.xyz = Set_Outline_Color.xyz * (1 - volOpacity) + volColor * _OutlineVisible; outColor =float4(Set_Outline_Color, _OutlineVisible ); #elif _IS_OUTLINE_CLIPPING_YES float4 _ClippingMask_var = SAMPLE_TEXTURE2D(_ClippingMask, sampler_MainTex, TRANSFORM_TEX(Set_UV0, _ClippingMask)); float Set_MainTexAlpha = _MainTex_var.a; float _IsBaseMapAlphaAsClippingMask_var = lerp( _ClippingMask_var.r, Set_MainTexAlpha, _IsBaseMapAlphaAsClippingMask ); float _Inverse_Clipping_var = lerp( _IsBaseMapAlphaAsClippingMask_var, (1.0 - _IsBaseMapAlphaAsClippingMask_var), _Inverse_Clipping ); float Set_Clipping = saturate((_Inverse_Clipping_var+_Clipping_Level)); clip(Set_Clipping - 0.5); float4 Set_Outline_Color = lerp( float4(_Is_BlendBaseColor_var, Set_Clipping), float4((_OutlineTex_var.rgb * _Outline_Color.rgb * ambientSkyColor),Set_Clipping), _Is_OutlineTex ); Set_Outline_Color = lerp(Set_Outline_Color, overridingColor, maskEnabled); Set_Outline_Color.w *= _OutlineVisible; 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); float3 V = GetWorldSpaceNormalizeViewDir(input.positionRWS); float3 volColor, volOpacity; EvaluateAtmosphericScattering(posInput, V, volColor, volOpacity); // Premultiplied alpha Set_Outline_Color.xyz = Set_Outline_Color.xyz * (1 - volOpacity.x) + volColor * Set_Outline_Color.w; outColor = Set_Outline_Color; #endif //outColor.rgb = ambientSkyColor; #ifdef _DEPTHOFFSET_ON outputDepth = posInput.deviceDepth; #endif #ifdef UNITY_VIRTUAL_TEXTURING outVTFeedback = builtinData.vtPackedFeedback; #endif } // End of File