VR的左右眼渲染方法

VR的左右眼视频渲染shader

unity_StereoEyeIndex 结点可以判断当前渲染的时候左眼还是右眼,所以可以通过着色器来更根据当前眼睛使用不同的渲染方式达到左右眼渲染不同。

c 复制代码
Shader "Unlit/VRVideoPlay"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [KeywordEnum(None, Top_Bottom, Left_Right, Custom_UV)] Stereo ("Stereo Mode", Float) = 0
        [KeywordEnum(None, Left, Right)] ForceEye ("Force Eye Mode", Float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile MONOSCOPIC STEREO_TOP_BOTTOM STEREO_LEFT_RIGHT STEREO_CUSTOM_UV
            #pragma multi_compile_local FORCEEYE_NONE FORCEEYE_LEFT FORCEEYE_RIGHT
           
            #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;

            float2 SetVR_UV(float2 UV)
            {
                 #if FORCEEYE_NONE
                    // 左右采样
                    #if STEREO_LEFT_RIGHT
                        if (unity_StereoEyeIndex == 0)
                        {
                           return float2(UV.x / 2, UV.y);
                        }
                        else
                        {
                            return float2(UV.x / 2 + 0.5, UV.y);
                        }
                    #endif
                    // 上下采样
                    #if STEREO_TOP_BOTTOM
                        if (unity_StereoEyeIndex == 0)
                        {
                            return float2(UV.x, UV.y / 2);
                        }
                        else
                        {
                            return float2(UV.x, UV.y / 2 + 0.5);
                        }
                    #endif
                #elif FORCEEYE_LEFT
                    // 左右采样
                    #if STEREO_LEFT_RIGHT
                        return float2(UV.x / 2, UV.y);
                    #endif
                    // 上下采样
                    #if STEREO_TOP_BOTTOM
                        return float2(UV.x, UV.y / 2);
                    #endif
                #elif FORCEEYE_RIGHT
                    // 左右采样
                    #if STEREO_LEFT_RIGHT
                        return float2(UV.x / 2 + 0.5, UV.y);
                    #endif
                    // 上下采样
                    #if STEREO_TOP_BOTTOM
                       return float2(UV.x, UV.y / 2 + 0.5);
                    #endif
                #endif
                 return UV;
            }

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                float2 uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.uv=SetVR_UV(uv);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
        }
    }
}
相关推荐
工业HMI实战笔记2 天前
未来已来:AR、VR与AI在下一代HMI中的展望
人工智能·ar·vr
! 冰封雪莲 !3 天前
执法监管能力提升VR学练考系统解决方案
大数据·vr·环保
独立开发之道4 天前
Three.js 创建 VR 内容:四步把一个普通 3D 场景送进头显
javascript·3d·vr
XR技术研习社4 天前
从 PICO 文档看未来短期内的 Unity 版本选择
unity·游戏引擎·xr·vr
Jmyd01234 天前
VR实训室与AR实训方案差异对比及选型适配指南
ar·vr·虚拟现实·虚拟仿真·虚拟实训·虚拟仿真实训课件
世优科技虚拟人11 天前
VR大空间定制开发商业化观察,经典IP沉浸式展演撑起文旅新业态
vr·数字人·ai数字人·vr大空间·世优科技
大江东去浪淘尽千古风流人物11 天前
【HMD-Poser】CVPR2024 头显端实时全身动捕:可伸缩稀疏观测、LSTM+Transformer 时空解耦与在线体型估计
人工智能·lstm·transformer·vr·人体姿态估计
QYRdata12 天前
年复合增长率达10.4%!2026-2032年VR游戏开发服务赛道驶入高速成长周期
microsoft·vr
旗开得胜马到成功14 天前
工控系统备份的底层技术解析:老旧协议、零停机窗口与中科热备的专项破局
运维·服务器·vr
CDN36014 天前
360CDN发布元宇宙与VR/AR加速方案:边缘渲染与超低延迟流媒体,彻底终结眩晕感
ar·vr·cdn加速·cdn防御