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: Sprite masking - Unity Answers
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!