- Home /
Render a object on top of another.
I have two objects in the scene.
How can I make it, that the red Object is always seen by the camera? Here, red is seen by the camera with red color.
I read somewhere, that is possible with the depth of a second camera. But I want a shader.
I found, that it must be possible with a tag in a shader like this here:
Tags { "Queue" = "Overlay" }
or with this:
Tags { "Queue" = "Geometry+1" }
But it's not working with these tags.
Here the full shader code:
Shader "Custom/ObjectControlAxisZ" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "Queue" = "Geometry+1" "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Answer by tanoshimi · Jul 04, 2015 at 11:53 AM
You want the ZTest Always
tag. (And possibly also ZWrite Off
).
Is that offer us a 4D effect? I can see the diffuse function has 4 vertices. I think we are using 4 vertices for 4D object, aren't we?
There is a more helpful answer by lolmaster2 below with a code example with twice as many upvotes. Why is this one still marked as the best answer?
Answer by lolmaster2 · Feb 01, 2017 at 09:05 AM
1 - In the menu: Assets -> Create -> Shader -> Standard Surface Shader
2 - Name it AlwaysOnTop
3 - Open it and replace the content with this code
4 - In the Inspector goto your material and choose your new shader: Custom -> AlwaysOnTop
You can also use transparency by changing the alpha value of the "Text Color" parameter of the material (the shader is just a modified version of the 3D Text Shader)
Shader "Custom/AlwaysOnTop" {
Properties {
_MainTex ("Font Texture", 2D) = "white" {}
_Color ("Text Color", Color) = (1,1,1,1)
_StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255
_ColorMask ("Color Mask", Float) = 15
}
SubShader {
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
}
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
Lighting Off
Cull Off
ZTest Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform fixed4 _Color;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color * _Color;
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
#ifdef UNITY_HALF_TEXEL_OFFSET
o.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
#endif
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = i.color;
col.a *= tex2D(_MainTex, i.texcoord).a;
clip (col.a - 0.01);
return col;
}
ENDCG
}
}
}
This is by far a better answer than any of the others I have come across. Why is it not marked as the best answer?
This does not seem to work with virtual reality enabled. Any idea why?
Awesome. This worked great for me (in VR). Even with semi-transparent colours.
Answer by conscienceawake · Nov 06, 2018 at 10:02 AM
can anyone hep , i have a problem i need to solve
sprite 1 = is an overlay is in front of everything sprite 2 = buildings, are behind the overlay sprite 3 = stars, are behind the buildings
i want to render sprite 3 on top of sprite 1, but i want to render sprite 3 behind sprite 2 and sprite 2 must render behind sprite 1.
any Ideas :(
assu$$anonymous$$g sprite 2 is completely opaque then this can be achieved with a sprite mask. Sprite3 is in front of everything, Sprite1 is behind Sprite3, Sprite2 is behind Sprite1, Sprite2 has a sprite$$anonymous$$ask component blocking out parts of Sprite3.
Your answer
Follow this Question
Related Questions
Is particular object visible 1 Answer
Using a camera replacement shader but keeping the underlying (original) colors? -4 Answers
Using Multiple Tiles for Textures 0 Answers
Material problem? 0 Answers
Transparency cutting opaque mesh 0 Answers