- Home /
Stencil Buffer working in scene view but black in game view.
I'm working on a VR game right now and the team consists of only programmers (student project) so I was thinking of making circular windows using a stencil test, however, it's working in Scene view but gives black circle in game view instead of the skybox. Can anyone help me in fixing this please ?
Mask Shader for the cylinder :
Shader "Stencil/CircularWindow"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
ColorMask 0
Pass
{
Stencil
{
Ref 2
Comp always
Pass replace
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
Stencil Test shader for the wall :
![Shader "Stencil/WindowWallShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Stencil
{
Ref 2
Comp NotEqual
Pass keep
}
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
// #pragma instancing_options assumeuniformscaling
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}][1]
[1]: /storage/temp/114060-gameview.png
Answer by Bunny83 · Mar 31, 2018 at 08:38 PM
You only disabled writing into the color buffer:
ColorMask 0
But you forget to disable writing into the ZBuffer:
ZWrite off
That means, even your shader doesn't "draw" anything into the color buffer, it still writes the depth of the mesh into the depth buffer. This of course blocks the skybox (and possible other geometry) to be rendered behind that "object". Your shader only wants to perform stencil operations and shouldn't touch the color or depth buffer.
I'd buy you a pizza if i could xD. Do you also know how to use stencil buffer in post processing shaders ? I tried using the approach by $$anonymous$$B$$anonymous$$ in https://forum.unity.com/threads/leveraging-stencil-buffers-for-masked-post-effects.313466/.
I made a separate camera, set the main camera's targetTexture to use it for post processing and in OnPostRender I was using Graphics.Blit() to render into the buffer's color buffer first by a simple copy shader and then using my post-processing one.
When i made the rendertextures public, I could see everything working perfectly but the game view is black screen so
RenderTexture.active = null;
Graphics.Blit(Buffer, SimpleRender);
is not working I guess. Do you know how to render the final bufferTexture to the main screen ?
Never$$anonymous$$d, I solved it. Apparently, if $$anonymous$$SAA is enabled, I get a black screen otherwise the post-processing works. Still don't know why though :/
Hi @Bunny83, I have the same problem, but I have disabled ZBuffer as well. In my case everything actually worked fine until I made a copy of the object with stencil mask and after that it stopped working in gameplay, even though in scene view everything works fine....
Your answer
Follow this Question
Related Questions
Use stencil buffer to hide objects with same shader? 1 Answer
Looking for Stencil Buffer examples/tutorials 1 Answer
Showing hidden units - using stencil buffer with standard shader and deferred rendering 0 Answers
Stencil shader object "colliding" with outside of mesh 1 Answer
Using stencil buffer as form of zwrite? 0 Answers