How to Stop Particle effects from overlapping via stenciling/shading
See pic related, Im basically trying to make my particles effects, in this case which are emited in a circle orevented from overallping, i thought this may be possible via shading/stenciling in which the partices have a material attached which makes them invisible if they come into contact with another material, currently i can do the opposite of this however the stencils i used to achieve this i dont currently understand, i have them linked bellow
the stencils work in the sense that both of them will make a sprite invisible in game, however if a sprite with Stencil 1 overlaps a sprite with Stencil 2, then the sprite with stencil 2 will appear visible while it is over it, what im trying to figure out is how i can make a stencil 3 which is visible but will turn invisible in the presence of stencil 1, hope that clears up what im trying to do
here are the stencil shaders
Shader "Custom/Stencil1" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} }
SubShader { Tags {"Queue"="Transparent+1" "IgnoreProjector"="True"} ZWrite Off AlphaTest Greater 0.5 ColorMask 0 ZTest Always
Stencil {
Ref 1
Comp always
Pass replace
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : COLOR
{
fixed4 col = tex2D(_MainTex, i.texcoord);
//if(col.a<0.1)discard;
return col;
}
ENDCG
}
}
}
Shader "Custom/stencil2" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} }
SubShader { Tags {"Queue"="Transparent+2" "IgnoreProjector"="True" "RenderType"="Transparent"} ZWrite Off Blend SrcAlpha OneMinusSrcAlpha
Stencil {
Ref 1
Comp Equal
}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : COLOR
{
fixed4 col = tex2D(_MainTex, i.texcoord);
return col;
}
ENDCG
}
}
}