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
相关产品推荐
相关产品推荐

