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