当前位置: 首页 > article >正文

VR的左右眼渲染方法

VR的左右眼视频渲染shader

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

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
        }
    }
}


http://www.kler.cn/a/387039.html

相关文章:

  • DIP switch是什么?
  • (六)Spark大数据开发实战:豆瓣电影数据处理与分析(scala版)
  • ios swift开发--ios远程推送通知配置
  • 探索Python的HTTP利器:Requests库的神秘面纱
  • 基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解
  • Llama架构及代码详解
  • 如何使用 Python 语言的正则表达式进行网页数据的爬取?
  • OpenCV进阶
  • .Net Core 6.0 WebApi在Centos中部署
  • bug日常记录responded with a status of 413 (Request Entity Too Large)
  • 【redis】延迟双删策略
  • k8s笔记——核心概念
  • Axure PR 9 多级下拉选择器 设计交互
  • qt QTextFrame详解
  • 高级java每日一道面试题-2024年10月28日-RabbitMQ篇-RabbitMQ的使用场景有哪些?
  • react-copy-to-clipboard: 一个简单的 React 用于复制文本到剪贴板的组件
  • 深度学习基础—了解词嵌入
  • 《Elasticsearch 实战应用》
  • 【数据仓库】Hive 拉链表实践
  • 汽车共享行业:SpringBoot管理系统革命
  • 深入浅出WebSocket(实践聊天室demo)
  • 掌握鸿蒙生态的崛起之机:开发者的挑战与机遇
  • 递推经典例题 - 爬楼梯
  • 微服务系列五:避免雪崩问题的限流、隔离、熔断措施
  • mybatis+postgresql,无感读写json字段
  • Docker 中部署 SQL Server