Hide part of a sprite that is under another sprite(or part of UI under gameobject). Help with shaders
Hello everyone. I want to make one game object to become partially invisible when its under another game object. I use Unity 5.2.
For example. I have two sprites: car A and car B. When car B is over car A, both of them must become transparent in the parts they intersect. Here is what I want:
I googled and found some similiar questions. But, unfortunately, most of them are outdated. The only one working almost fine is here: http://answers.unity3d.com/questions/787137/sprite-masking.html BUT! When I try to use this shader(standard unlit shader with changed tags: queue set to +2 and render type to transparent):
Shader "Unlit/TransparencyShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
"Queue" = "Transparent+2"
"RenderType" = "Transparent"
}
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
with this shader that I took from the question I linked:
Shader "Custom/MaskTest" {
Properties
{
_MainTex("Base (RGB) Alpha (A)", 2D) = "white" {}
_Cutoff("Base Alpha cutoff", Range(0,.9)) = .5
}
SubShader{
Tags{ "Queue" = "Transparent+1" }
Offset 0, -1
ColorMask 0
ZWrite On
Pass
{
AlphaTest Greater[_Cutoff]
SetTexture[_MainTex]{
combine texture * primary, texture
}
}
}
}
Here is what I get:
In Scene window it works just as I need, but in Game window the second sprite always has the colour of skybox. Can somebody tell me what am I doing wrong? Besides, I need to still render the objects behind those two sprites, like in the first picture, the backgound must be rendered, not just empty, but with help of this shader background is not drawn(in scene window). And another very important question: will I be able to use this method to hide a part of UI element behind a 3d game object(line renderer)? Or at least between two UI elements? Thanks!
Answer by Lazybones94 · Nov 04, 2015 at 03:23 PM
I figured that the problem was simply that there was no background for it. I just added a background ui image(these shaders work fine with UI) and used standard Mobile/Unlit shader for it.
Could you post the full solution along with the shader code and some tips how to implement that? I'm working on shadow casting system to a fully 2D isometric game and need a thing like that, but unfortunately I'm not into shaders... Thanks!
Your answer

Follow this Question
Related Questions
GL QUADS are being painted with the wrong color 0 Answers
Get UV warped texture as another texture 0 Answers
Receive Shadow Mesh Renderer - Weird Effect 0 Answers
Tilemap Shader Glitch 0 Answers
HDRP and UMMORPG server 1 Answer