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)
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.
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
}
}
}
Answer by DigitalDesignDude · May 06, 2020 at 03:06 AM
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.
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.
Your answer
Follow this Question
Related Questions
Billboard shader lock roll(z) rotation 0 Answers
Stencils and zTest be buggin 0 Answers
[SOLVED]Billboard sprite shader 1 Answer
Emissive Blended Decal 0 Answers
ShaderGraph Y-Axis Billboard 0 Answers