Vive Controller render over UI Overlay Shader?

Hallo everyone,

I am using the GUIOverlay shader (code below) from the VR Samples packages which let’s you draw World-Space UIs on top of all scene objects.

What I need is to have my Vive Controller models render ON TOP of all these overlay UIs. I know I could probably duplicate the stereo rig and work with Culling masks so that one camera renders everything but the controllers and another camera set to “Depth only” renders only the controllers with a higher Depth value. But I am not sure if it is a good idea to work with duplicate VR stereo rigs in terms of performance. Maybe these has other implications as well?

Alternatively, is there a way to have my controllers “cut holes” into the UIs so that they work as masks for the UIs? Does this go into the field of stencil shaders? Any idea how I could accomplish this effect?

Thank you very much for any help!

Sean

Shader "UI/Overlay"
{
    Properties
    {
        [PerRendererData] _MainTex ("Font Texture", 2D) = "white" {}

        _Color("Tint", 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
    {
        LOD 100

        Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas" = "True"
        }

        Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }
       
        Cull Off
        Lighting Off
        ZWrite Off
        ZTest Always
        Offset -1, -1
        Blend SrcAlpha OneMinusSrcAlpha
        ColorMask [_ColorMask]

        Pass
        {
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                #include "UnityUI.cginc"

                struct appdata_t
                {
                    float4 vertex : POSITION;
                    float2 texcoord : TEXCOORD0;
                    float4 color : COLOR;
                };
   
                struct v2f
                {
                    float4 vertex : SV_POSITION;
                    half2 texcoord : TEXCOORD0;
                    fixed4 color : COLOR;
                };
   
                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed4 _Color;
                fixed4 _TextureSampleAdd;
               
                v2f vert (appdata_t v)
                {
                    v2f o;
                    o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                    o.color = v.color * _Color;
#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 = (tex2D(_MainTex, i.texcoord) + _TextureSampleAdd) * i.color;
                    clip (col.a - 0.01);
                    return col;
                }
            ENDCG
        }
    }
}
1 Like

Hi Sean.
Ever found a simple solution to this?