Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Help with Stencil Shader

Discussion in 'Shaders' started by KaidaStudios, Jul 17, 2020.

  1. KaidaStudios

    KaidaStudios

    Joined:
    Aug 4, 2017
    Posts:
    34
    I have attempted to make a stencil shader that hides the mesh behind it, however, I'm having issues making it act correctly. This shader works as intended and hides all skin underneath it, but it will show the clothing behind the skin and even show the clothing behind some random objects. Any help is greatly appreciated!

    StencilErrors.png

    Cover Shader:

    Code (CSharp):
    1. Shader "Cover"
    2. {
    3.      Properties {
    4.             _Color ("Color", Color) = (1,1,1,1)
    5.             _MainTex ("Texture", 2D) = "white" {}
    6.             _OutlineColor ("Outline Color", Color) = (0,0,0,1)
    7.             _Outline ("Outline width", Range (0, 1)) = .1
    8.             _StencilMask("Stencil Mask", Range(0, 255)) = 1
    9.         }
    10.        
    11.        
    12.         SubShader {
    13.             Tags { "RenderType"="Opaque" "Queue"="Geometry-1"}
    14.             LOD 200
    15.             //ColorMask 0
    16.              Stencil{
    17.             Ref [_StencilMask]
    18.             Comp Never
    19.             Fail Replace
    20.         }
    21.             Pass
    22.         {
    23.             CGPROGRAM
    24.             #pragma vertex vert
    25.             #pragma fragment frag
    26.             #include "UnityCG.cginc"
    27.             struct appdata
    28.             {
    29.                 float4 vertex : POSITION;
    30.                 float2 uv : TEXCOORD0;
    31.             };
    32.             struct v2f
    33.             {
    34.                 float2 uv : TEXCOORD0;
    35.                 float4 vertex : SV_POSITION;
    36.             };
    37.             sampler2D _MainTex;
    38.             float4 _MainTex_ST;
    39.      
    40.             v2f vert (appdata v)
    41.             {
    42.                 v2f o;
    43.                 o.vertex = UnityObjectToClipPos(v.vertex);
    44.                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    45.                 return o;
    46.             }
    47.      
    48.             fixed4 frag (v2f i) : SV_Target
    49.             {
    50.                 // sample the texture
    51.                 fixed4 col = tex2D(_MainTex, i.uv);
    52.                 return col;
    53.             }
    54.             ENDCG
    55.         }
    56.        
    57.        
    58.        
    59.         }
    60.        
    61.         SubShader {
    62. CGPROGRAM
    63. #pragma surface surf Lambert
    64. sampler2D _MainTex;
    65. fixed4 _Color;
    66. struct Input {
    67.     float2 uv_MainTex;
    68. };
    69. void surf (Input IN, inout SurfaceOutput o) {
    70.     fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    71.     o.Albedo = c.rgb;
    72.     o.Alpha = c.a;
    73. }
    74. ENDCG
    75.         Pass {
    76.             Name "OUTLINE"
    77.             Tags { "LightMode" = "Always" }
    78.             Cull Front
    79.             ZWrite On
    80.             ColorMask RGB
    81.             Blend SrcAlpha OneMinusSrcAlpha
    82.             CGPROGRAM
    83.             #pragma vertex vert
    84.             #pragma exclude_renderers gles xbox360 ps3
    85.             ENDCG
    86.             SetTexture [_MainTex] { combine primary }
    87.         }
    88.     }
    89.    
    90.     SubShader {
    91.         //Tags {"Queue" = "Geometry+100" }
    92. CGPROGRAM
    93. #pragma surface surf Lambert
    94. sampler2D _MainTex;
    95. fixed4 _Color;
    96. struct Input {
    97.     float2 uv_MainTex;
    98. };
    99. void surf (Input IN, inout SurfaceOutput o) {
    100.     fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    101.     o.Albedo = c.rgb;
    102.     o.Alpha = c.a;
    103. }
    104. ENDCG
    105.         // note that a vertex shader is specified here but its using the one above
    106.         Pass {
    107.             Name "OUTLINE"
    108.             Tags { "LightMode" = "Always" }
    109.             Cull Front
    110.             ZWrite On
    111.             ColorMask RGB
    112.             Blend SrcAlpha OneMinusSrcAlpha
    113.             //Offset 50,50
    114.             CGPROGRAM
    115.             #pragma vertex vert
    116.             #pragma fragment frag
    117.             half4 frag(v2f i) :COLOR { return i.color; }
    118.             ENDCG
    119.         }
    120.     }
    121. Fallback "Diffuse"
    122.         }
    123.        
    Under Shader:
    Code (CSharp):
    1. Shader "Under"
    2. {
    3.      Properties
    4.     {
    5.         _Color("Color", Color) = (1,1,1,1)
    6.         _MainTex("Albedo", 2D) = "white" {}
    7.        
    8.         _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
    9.  
    10.         _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
    11.         _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
    12.         [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0
    13.  
    14.         [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
    15.         _MetallicGlossMap("Metallic", 2D) = "white" {}
    16.  
    17.         [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
    18.         [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0
    19.  
    20.         _BumpScale("Scale", Float) = 1.0
    21.         _BumpMap("Normal Map", 2D) = "bump" {}
    22.  
    23.         _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
    24.         _ParallaxMap ("Height Map", 2D) = "black" {}
    25.  
    26.         _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
    27.         _OcclusionMap("Occlusion", 2D) = "white" {}
    28.  
    29.         _EmissionColor("Color", Color) = (0,0,0)
    30.         _EmissionMap("Emission", 2D) = "white" {}
    31.        
    32.         _DetailMask("Detail Mask", 2D) = "white" {}
    33.  
    34.         _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
    35.         _DetailNormalMapScale("Scale", Float) = 1.0
    36.         _DetailNormalMap("Normal Map", 2D) = "bump" {}
    37.  
    38.         [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0
    39.  
    40.  
    41.         // Blending state
    42.         [HideInInspector] _Mode ("__mode", Float) = 0.0
    43.         [HideInInspector] _SrcBlend ("__src", Float) = 1.0
    44.         [HideInInspector] _DstBlend ("__dst", Float) = 0.0
    45.         [HideInInspector] _ZWrite ("__zw", Float) = 1.0
    46.         _StencilMask("Stencil Mask", Range(0, 255)) = 1
    47.     }
    48.     SubShader
    49.     {
    50.         Tags { "RenderType"="Opaque" }
    51.         LOD 200
    52.          Stencil{
    53.             Ref [_StencilMask]
    54.             Comp NotEqual
    55.             Pass Zero
    56.         }
    57.        
    58.         Pass
    59.         {
    60.             CGPROGRAM
    61.             #pragma vertex vert
    62.             #pragma fragment frag
    63.             #include "UnityCG.cginc"
    64.             struct appdata
    65.             {
    66.                 float4 vertex : POSITION;
    67.                 float2 uv : TEXCOORD0;
    68.             };
    69.             struct v2f
    70.             {
    71.                 float2 uv : TEXCOORD0;
    72.                 float4 vertex : SV_POSITION;
    73.             };
    74.             sampler2D _MainTex;
    75.             float4 _MainTex_ST;
    76.      
    77.             v2f vert (appdata v)
    78.             {
    79.                 v2f o;
    80.                 o.vertex = UnityObjectToClipPos(v.vertex);
    81.                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    82.                 return o;
    83.             }
    84.      
    85.             fixed4 frag (v2f i) : SV_Target
    86.             {
    87.                 // sample the texture
    88.                 fixed4 col = tex2D(_MainTex, i.uv);
    89.                 return col;
    90.             }
    91.             ENDCG
    92.         }
    93.         // ------------------------------------------------------------------
    94.         //  Base forward pass (directional light, emission, lightmaps, ...)
    95.         Pass
    96.         {
    97.             Name "FORWARD"
    98.             Tags { "LightMode" = "ForwardBase" }
    99.  
    100.             Blend [_SrcBlend] [_DstBlend]
    101.             ZWrite [_ZWrite]
    102.  
    103.             CGPROGRAM
    104.             #pragma target 3.0
    105.  
    106.             // -------------------------------------
    107.  
    108.             #pragma shader_feature _NORMALMAP
    109.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    110.             #pragma shader_feature _EMISSION
    111.             #pragma shader_feature _METALLICGLOSSMAP
    112.             #pragma shader_feature ___ _DETAIL_MULX2
    113.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    114.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    115.             #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
    116.             #pragma shader_feature _PARALLAXMAP
    117.  
    118.             #pragma multi_compile_fwdbase
    119.             #pragma multi_compile_fog
    120.  
    121.             #pragma vertex vertBase
    122.             #pragma fragment fragBase
    123.             #include "UnityStandardCoreForward.cginc"
    124.  
    125.             ENDCG
    126.         }
    127.         // ------------------------------------------------------------------
    128.         //  Additive forward pass (one light per pass)
    129.         Pass
    130.         {
    131.             Name "FORWARD_DELTA"
    132.             Tags { "LightMode" = "ForwardAdd" }
    133.             Blend [_SrcBlend] One
    134.             Fog { Color (0,0,0,0) } // in additive pass fog should be black
    135.             ZWrite Off
    136.             ZTest LEqual
    137.  
    138.             CGPROGRAM
    139.             #pragma target 3.0
    140.  
    141.             // -------------------------------------
    142.  
    143.  
    144.             #pragma shader_feature _NORMALMAP
    145.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    146.             #pragma shader_feature _METALLICGLOSSMAP
    147.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    148.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    149.             #pragma shader_feature ___ _DETAIL_MULX2
    150.             #pragma shader_feature _PARALLAXMAP
    151.  
    152.             #pragma multi_compile_fwdadd_fullshadows
    153.             #pragma multi_compile_fog
    154.  
    155.  
    156.             #pragma vertex vertAdd
    157.             #pragma fragment fragAdd
    158.             #include "UnityStandardCoreForward.cginc"
    159.  
    160.             ENDCG
    161.         }
    162.         // ------------------------------------------------------------------
    163.         //  Shadow rendering pass
    164.         Pass {
    165.             Name "ShadowCaster"
    166.             Tags { "LightMode" = "ShadowCaster" }
    167.  
    168.             ZWrite On ZTest LEqual
    169.  
    170.             CGPROGRAM
    171.             #pragma target 3.0
    172.  
    173.             // -------------------------------------
    174.  
    175.  
    176.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    177.             #pragma multi_compile_shadowcaster
    178.  
    179.             #pragma vertex vertShadowCaster
    180.             #pragma fragment fragShadowCaster
    181.  
    182.             #include "UnityStandardShadow.cginc"
    183.  
    184.             ENDCG
    185.         }
    186.         // ------------------------------------------------------------------
    187.         //  Deferred pass
    188.         Pass
    189.         {
    190.             Name "DEFERRED"
    191.             Tags { "LightMode" = "Deferred" }
    192.  
    193.             CGPROGRAM
    194.             #pragma target 3.0
    195.             #pragma exclude_renderers nomrt
    196.  
    197.  
    198.             // -------------------------------------
    199.  
    200.             #pragma shader_feature _NORMALMAP
    201.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    202.             #pragma shader_feature _EMISSION
    203.             #pragma shader_feature _METALLICGLOSSMAP
    204.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    205.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    206.             #pragma shader_feature ___ _DETAIL_MULX2
    207.             #pragma shader_feature _PARALLAXMAP
    208.  
    209.             #pragma multi_compile ___ UNITY_HDR_ON
    210.             #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON
    211.             #pragma multi_compile ___ DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
    212.             #pragma multi_compile DYNAMICLIGHTMAP_OFF DYNAMICLIGHTMAP_ON
    213.  
    214.             #pragma vertex vertDeferred
    215.             #pragma fragment fragDeferred
    216.  
    217.             #include "UnityStandardCore.cginc"
    218.  
    219.             ENDCG
    220.         }
    221.  
    222.         // ------------------------------------------------------------------
    223.         // Extracts information for lightmapping, GI (emission, albedo, ...)
    224.         // This pass it not used during regular rendering.
    225.         Pass
    226.         {
    227.             Name "META"
    228.             Tags { "LightMode"="Meta" }
    229.  
    230.             Cull Off
    231.  
    232.             CGPROGRAM
    233.             #pragma vertex vert_meta
    234.             #pragma fragment frag_meta
    235.  
    236.             #pragma shader_feature _EMISSION
    237.             #pragma shader_feature _METALLICGLOSSMAP
    238.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    239.             #pragma shader_feature ___ _DETAIL_MULX2
    240.  
    241.             #include "UnityStandardMeta.cginc"
    242.             ENDCG
    243.         }
    244.     }
    245.  
    246.     SubShader
    247.     {
    248.         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
    249.         LOD 150
    250.  
    251.  
    252.         // ------------------------------------------------------------------
    253.         //  Base forward pass (directional light, emission, lightmaps, ...)
    254.         Pass
    255.         {
    256.             Name "FORWARD"
    257.             Tags { "LightMode" = "ForwardBase" }
    258.  
    259.             Blend [_SrcBlend] [_DstBlend]
    260.             ZWrite [_ZWrite]
    261.  
    262.             CGPROGRAM
    263.             #pragma target 2.0
    264.            
    265.             #pragma shader_feature _NORMALMAP
    266.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    267.             #pragma shader_feature _EMISSION
    268.             #pragma shader_feature _METALLICGLOSSMAP
    269.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    270.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    271.             #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
    272.             // SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2
    273.             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
    274.  
    275.             #pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
    276.  
    277.             #pragma multi_compile_fwdbase
    278.             #pragma multi_compile_fog
    279.  
    280.             #pragma vertex vertBase
    281.             #pragma fragment fragBase
    282.             #include "UnityStandardCoreForward.cginc"
    283.  
    284.             ENDCG
    285.         }
    286.         // ------------------------------------------------------------------
    287.         //  Additive forward pass (one light per pass)
    288.         Pass
    289.         {
    290.             Name "FORWARD_DELTA"
    291.             Tags { "LightMode" = "ForwardAdd" }
    292.             Blend [_SrcBlend] One
    293.             Fog { Color (0,0,0,0) } // in additive pass fog should be black
    294.             ZWrite Off
    295.             ZTest LEqual
    296.            
    297.             CGPROGRAM
    298.             #pragma target 2.0
    299.  
    300.             #pragma shader_feature _NORMALMAP
    301.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    302.             #pragma shader_feature _METALLICGLOSSMAP
    303.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    304.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    305.             #pragma shader_feature ___ _DETAIL_MULX2
    306.             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
    307.             #pragma skip_variants SHADOWS_SOFT
    308.            
    309.             #pragma multi_compile_fwdadd_fullshadows
    310.             #pragma multi_compile_fog
    311.            
    312.             #pragma vertex vertAdd
    313.             #pragma fragment fragAdd
    314.             #include "UnityStandardCoreForward.cginc"
    315.  
    316.             ENDCG
    317.         }
    318.         // ------------------------------------------------------------------
    319.         //  Shadow rendering pass
    320.         Pass {
    321.             Name "ShadowCaster"
    322.             Tags { "LightMode" = "ShadowCaster" }
    323.            
    324.             ZWrite On ZTest LEqual
    325.  
    326.             CGPROGRAM
    327.             #pragma target 2.0
    328.  
    329.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    330.             #pragma skip_variants SHADOWS_SOFT
    331.             #pragma multi_compile_shadowcaster
    332.  
    333.             #pragma vertex vertShadowCaster
    334.             #pragma fragment fragShadowCaster
    335.  
    336.             #include "UnityStandardShadow.cginc"
    337.  
    338.             ENDCG
    339.         }
    340.  
    341.         // ------------------------------------------------------------------
    342.         // Extracts information for lightmapping, GI (emission, albedo, ...)
    343.         // This pass it not used during regular rendering.
    344.         Pass
    345.         {
    346.             Name "META"
    347.             Tags { "LightMode"="Meta" }
    348.  
    349.             Cull Off
    350.  
    351.             CGPROGRAM
    352.             #pragma vertex vert_meta
    353.             #pragma fragment frag_meta
    354.  
    355.             #pragma shader_feature _EMISSION
    356.             #pragma shader_feature _METALLICGLOSSMAP
    357.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    358.             #pragma shader_feature ___ _DETAIL_MULX2
    359.  
    360.             #include "UnityStandardMeta.cginc"
    361.             ENDCG
    362.         }
    363.     }
    364. }
    365.  
     
  2. KaidaStudios

    KaidaStudios

    Joined:
    Aug 4, 2017
    Posts:
    34
    bump! Any help is appreciated!