Render Billboard Sprite on top of 3D Objects?

I’m creating a multiplayer split-screen retro fps game and am trying to make it so whenever a player shoots a wall, a billboarding shot-debris sprite instantiates at the point of impact.

Just like in the original doom game. (see below gif)

alt text

The problem is my current billboard shader doesn’t render the debris sprite fully on top of the 3D wall objects at certain angles. It can be cut off as you can see in the below gif.

alt text

Adding ZTest Always to my shader does solve the overlap issue, but unfortunately, it makes it so the sprite can be seen through walls by other players in the game.

Not sure if adding Offset -1, -1 would help as I don’t think it works with billboard shaders.

And I would like to avoid adding an actual offset from the wall since other players may see a gap between the sprite and the wall.

Any help is much appreciated. I’m just getting started with learning how to customize shaders. Here’s the billboard shader code I’m using as well.

Shader "Custom/Billboard"
{
	Properties
	{
	   _MainTex("Texture Image", 2D) = "white" {}
	   _ScaleX("Scale X", Float) = 1.0
	   _ScaleY("Scale Y", Float) = 1.0
	}
	SubShader
	{
		Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM

			#pragma vertex vert  
			#pragma fragment frag

			// User-specified uniforms            
			uniform sampler2D _MainTex;
			uniform float _ScaleX;
			uniform float _ScaleY;

			struct vertexInput
			{
				float4 vertex : POSITION;
				float4 tex : TEXCOORD0;
			};
			struct vertexOutput
			{
				float4 pos : SV_POSITION;
				float4 tex : TEXCOORD0;
			};

			vertexOutput vert(vertexInput input)
			{
				vertexOutput output;

				output.pos = mul(UNITY_MATRIX_P,
				mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
				+ float4(input.vertex.x, input.vertex.y, 0.0, 0.0)
				* float4(_ScaleX, _ScaleY, 1.0, 1.0));

				output.tex = input.tex;

				return output;
			}

			float4 frag(vertexOutput input) : COLOR
			{
				return tex2D(_MainTex, float2(input.tex.xy));
			}

			ENDCG
		}
	}
}

I think I found a solution for preventing the clipping while working properly for multiple player cameras.

I just used the default Ztest value with just enough offset that the sprite will render on top of 3d objects but not been seen through them.

ZTest LEqual 
Offset 0, -1000000  

This is a gif showing the shader working with a wall block placed in between two players.

alt text

In my case, I needed around -1000000 units of offset. I just played around with the offset until I found an amount that worked.

The only downside is the offset isn’t consistent on every device I tested. My Android TV requires far less of an offset than my PC.