Shader to render in front of all other objects problem

I’m trying to get translucent particle shaders to show in front of everything else (well, maybe not GUI elements).

I’ve tried searching for the solution and the techniques aren’t working.

I started by trying to modify the built in shaders, and have tried:
ZTest Always
“Queue”=“Overlay”
“Queue”=“Overlay+1”
“Queue”=“Geometry”
“Queue”=“Geometry+1”

And none of these seem to even change anything, let alone work.

At the moment, I’m trying to use them as targeting and selection indicators if that makes a difference.
I’m using particles, because they seemed to be a cheap and easy way to do this. They always face the camera, and take minimal resources.

“Queue” = “Overlay”
ZTest Always

Those two together should render things above everything else, unless you have lens flares or other overlay effects.

1 Like

I tried that. It didn’t work.

It should. If it’s not then something else is broken. Try posting the entire shader here so we can see if something else is wrong. You might also try making a new material with the shader and see if it still has the issue. I believe there’s a bug with materials overriding their shader’s queue in some situations.

My internet is down from the computer, but there’s nothing really to post.

It’s simply a built-in shader with the two changes you suggested:
“Particles/Additive (Soft)”
I changed Queue from “Transparent” to “Overlay”
Then added ZTest Always under Tags.

Also tried this with another shader:
“Particles/Alpha Blended”

Shader "Particles/Alpha Blended - Always Front" {
Properties {
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
    _MainTex ("Particle Texture", 2D) = "white" {}
    _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
}

Category {
    Tags { "Queue"="Overlay" "IgnoreProjector"="True" "RenderType"="Transparent" }
    ZTest Always
    Blend SrcAlpha OneMinusSrcAlpha
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off

    SubShader {
        Pass {
           
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_particles
            #pragma multi_compile_fog
           
            #include "UnityCG.cginc"
           
            sampler2D _MainTex;
            fixed4 _TintColor;
           
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                #ifdef SOFTPARTICLES_ON
                float4 projPos : TEXCOORD2;
                #endif
            };
           
            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                #ifdef SOFTPARTICLES_ON
                o.projPos = ComputeScreenPos (o.vertex);
                COMPUTE_EYEDEPTH(o.projPos.z);
                #endif
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            sampler2D_float _CameraDepthTexture;
            float _InvFade;
           
            fixed4 frag (v2f i) : SV_Target
            {
                #ifdef SOFTPARTICLES_ON
                float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));
                float partZ = i.projPos.z;
                float fade = saturate (_InvFade * (sceneZ-partZ));
                i.color.a *= fade;
                #endif
               
                fixed4 col = 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }   
}
}

You don’t happen to have soft particles turned on, that’ll make them still get occluded.

Hmmmn. Turning it off worked. However, I may still want soft particles for other things. Since this is a project setting, how can I do both?

Is there a better way to accomplish what I’m after?

Yes, it’s just because you’re using the particle shaders as your base. They do the initial z test to reject areas to draw in the fragment shader and then do an additional test against the depth buffer in the fragment shader to do soft intersections. If you just delete all of the shader between the #ifdef SOFTPARTICLES_ON and #endif (and those # lines) it’ll not do the work for soft particles and thus not get hidden.

1 Like

Ah, I see. This is perfect. Thanks!