You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity MRTK项目自定义Shader仅渲染左眼,如何实现双眼渲染?

问题描述

在使用MRTK的Unity项目中,将原有MRTK/Standard着色器替换为自定义的HoloUS/BrightnessContrast着色器后,物体仅在左眼可见,如何修改才能让物体在双眼正常渲染?

问题根源

VR/AR场景(包括MRTK)采用双视角渲染逻辑,MRTK标准着色器内置了双眼渲染的处理机制,但你的自定义着色器仅包含单个Pass,默认只会渲染单眼视角,因此只能在左眼看到物体。

修复方案

需要为自定义着色器添加立体渲染支持,以下是修改后的完整代码及关键改动说明:

修改后的完整着色器代码

"HoloUS/BrightnessContrast"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _Width("Width", Float) = 1
        _Center("Center", Float) = 0.5
    }
    
    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
        LOD 100

        Pass
        {
            CGPROGRAM
            
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #pragma multi_compile _ _STEREO_MULTIVIEW_ON
            
            #include "UnityCG.cginc"
            #include "UnityInstancing.cginc"

            struct VInp
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct VOut
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                UNITY_VERTEX_OUTPUT_STEREO
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Center;
            float _Width;

            VOut vert(VInp inp)
            {
                VOut o;
                UNITY_SETUP_INSTANCE_ID(inp);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                
                o.vertex = UnityObjectToClipPos(inp.vertex);
                o.uv = TRANSFORM_TEX(inp.uv, _MainTex);
                return o;
            }

            fixed4 frag(VOut inp) : SV_Target
            {
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(inp);
                
                float min = _Center - _Width / 2;
                return tex2D(_MainTex, inp.uv) * _Width + min;
            }
            
            ENDCG
        }
    }
    FallBack "MRTK/Standard"
}

关键改动说明

  • 适配渲染管线:在SubShader的Tags中添加"RenderPipeline" = "UniversalPipeline",确保和MRTK常用的URP管线兼容(若项目用内置管线可删除此标签)
  • 启用立体渲染宏:添加#pragma multi_compile_instancing和#pragma multi_compile _ _STEREO_MULTIVIEW_ON,让着色器支持双视角渲染
  • 添加立体渲染数据结构:在顶点输入/输出结构体中加入UNITY_VERTEX_INPUT_INSTANCE_ID和UNITY_VERTEX_OUTPUT_STEREO宏,处理双眼的实例化与视角数据
  • 初始化立体渲染环境:顶点函数中调用UNITY_SETUP_INSTANCE_ID和UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO,确保视角数据正确初始化
  • 标记当前渲染眼:片元函数中调用UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX,保证当前Pass渲染对应眼睛的画面
  • 添加回退着色器:设置FallBack "MRTK/Standard",当自定义着色器不支持某些MRTK特性时,自动 fallback 到标准着色器,避免兼容性问题

内容的提问来源于stack exchange,提问作者Hadi Fooladi Talari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:33:34