Shader "2D/RenderAs2D-Flattening" { Properties { // Legacy properties. They're here so that materials using this shader can gracefully fallback to the legacy sprite shader. [HideInInspector] _Color("Tint", Color) = (1,1,1,1) [HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1) [HideInInspector] _Flip("Flip", Vector) = (1,1,1,1) [HideInInspector] _AlphaTex("External Alpha", 2D) = "white" {} [HideInInspector] _EnableExternalAlpha("Enable External Alpha", Float) = 0 } SubShader { Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" } Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha Cull Off ZTest Always ZWrite On ColorMask 0 Stencil { Ref 128 // Put this in the last bit of our stencil value for maximum compatibility with sprite mask ReadMask 128 WriteMask 128 Comp equal Pass zero } Pass { Tags { "LightMode" = "Universal2D" } HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #pragma vertex ColorVertex #pragma fragment ColorFragment struct Attributes { float3 positionOS : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; UNITY_VERTEX_OUTPUT_STEREO }; Varyings ColorVertex(Attributes v) { Varyings o = (Varyings)0; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); // We need to flatten the object relative to the camera. After it has been transformed to clip space, we can set the z value to the object's origin. float4 originCS = TransformObjectToHClip(float3(0, 0, 0)); o.positionCS = TransformObjectToHClip(v.positionOS); //o.positionCS.z = (originCS.z * o.positionCS.w) / originCS.w; o.positionCS.z = 0; return o; } half4 ColorFragment(Varyings i) : SV_Target { const half4 color = half4(0,0,1,1); return color; } ENDHLSL } Pass { Tags { "LightMode" = "NormalsRendering"} HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #pragma vertex NormalsRenderingVertex #pragma fragment NormalsRenderingFragment struct Attributes { float3 positionOS : POSITION; float4 color : COLOR; float2 uv : TEXCOORD0; float3 normal : NORMAL; float4 tangent : TANGENT; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; half4 color : COLOR; float2 uv : TEXCOORD0; half3 normalWS : TEXCOORD1; half3 tangentWS : TEXCOORD2; half3 bitangentWS : TEXCOORD3; UNITY_VERTEX_OUTPUT_STEREO }; TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); TEXTURE2D(_NormalMap); SAMPLER(sampler_NormalMap); half4 _NormalMap_ST; // Is this the right way to do this? Varyings NormalsRenderingVertex(Attributes attributes) { Varyings o = (Varyings)0; UNITY_SETUP_INSTANCE_ID(attributes); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); float4 originCS = TransformObjectToHClip(float3(0, 0, 0)); o.positionCS = TransformObjectToHClip(attributes.positionOS); //o.positionCS.z = (originCS.z * o.positionCS.w) / originCS.w; o.positionCS.z = 0; return o; } #include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/NormalsRenderingShared.hlsl" half4 NormalsRenderingFragment(Varyings i) : SV_Target { const half4 color = half4(0,0,1,1); return color; } ENDHLSL } Pass { Tags { "LightMode" = "UniversalForward" "Queue"="Transparent" "RenderType"="Transparent"} ZTest Never ZWrite Off HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #pragma vertex UnlitVertex #pragma fragment UnlitFragment struct Attributes { float3 positionOS : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; UNITY_VERTEX_OUTPUT_STEREO }; Varyings UnlitVertex(Attributes attributes) { Varyings o = (Varyings)0; UNITY_SETUP_INSTANCE_ID(attributes); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.positionCS = TransformObjectToHClip(attributes.positionOS); return o; } float4 UnlitFragment(Varyings i) : SV_Target { return float4(0,0,0,0); } ENDHLSL } } Fallback "Sprites/Default" }