当前位置:   article > 正文

Daydream播放3D视频(视频左右分屏3D效果)_vr左右双屏幕视频

vr左右双屏幕视频


需求分析:

         因为VR项目需求,要实现3D视频的播放,即左右分屏视频播放。如下图所示类型视频。


使用GoogleVRForUnity插件实现VR功能效果。项目刚开始使用的是0.8的老版本插件,可以轻松实现3D视频的播放效果,但升级GoogleVRForUnity插件到1.10接入Daydream后,发现3D视频播放3D效果没有了。

 

解决方案:

一、未接入Daydream前实现方式。

1:老版本实现3D视频比较简单,GoogleVR实现了两个摄像机,可以通过设置左右摄像机的CullingMask可实现左眼看左图像,右眼看右图像。

        

2:播放器视图物体Layer一定要设置正确,左视图设置3DScreenLeftPart;右视图设置3DScreenRightPart;如下图所示:

 

 

3:通过代码修改相应的材质属性,将左右格式的图像区分开


即修改下图所示属性数值:


其它步骤不再复述。

OK,通过上面的步骤就可实现3D视频的播放。

二、接入Daydream后实现方式。(即升级GoogleVRForUnity插件到1.10版本)

接入Daydream后,发现GoogleVR在真机上没有3D效果了。经过分析发现GoogleVR优化了渲染方式。真机上运行时,只保留了一个主摄像机。所以老版本的设置方法都没用了。这怎么办?其实google已经给出了解决方案。我也是找了好久才看到。

1:先看图:


VideoDemoStereoShader视频立体Shader,这个是什么?从字面理解就可知道是为了实现视频立体效果。这里我对这个Shader做了一些修改,以适应项目需求。下面直接看代码:

  1. // Shader that renders a "left on top"stereo texture
  2. Shader "GoogleVR/VideoStereoShader"{
  3. Properties {
  4. _MainTex ("Albedo (RGB)", 2D) = "white" {}
  5. }
  6. SubShader{
  7. Pass{
  8. Tags { "RenderType"="Opaque" }
  9. CGPROGRAM
  10. #pragmavertex vert
  11. #pragma fragment frag
  12. #include "UnityCG.cginc"
  13. #include "GvrUnityCompatibility.cginc"
  14. float4 _MainTex_ST;
  15. sampler2D _MainTex;
  16. //是否为左右格式视频 1:上下格式 其它:左右格式
  17. int_isUpDownVideo;
  18. //视频左右上下格式是否正确 1:错误(即左右顺序不对,左图像放到了右边;右图像放到了左边) 其它:正常
  19. int_isVidePerversion;
  20. //C#代码修改以上两个数值 例如://Shader.SetGlobalInt("_isUpDownVideo",0);
  21. struct v2f {
  22. float4 pos : SV_POSITION;
  23. float2 uv : TEXCOORD0;
  24. };
  25. v2fvert(appdata_base v) {
  26. v2fo;
  27. o.pos= GvrUnityObjectToClipPos(v.vertex);
  28. o.uv= TRANSFORM_TEX(v.texcoord, _MainTex);
  29. //unity_StereoEyeIndex //0为左或上 1为右或下
  30. if(_isUpDownVideo == 1)
  31. {
  32. o.uv.y*= 0.5f;
  33. if(_isVidePerversion == 1)
  34. {
  35. if(unity_StereoEyeIndex == 0) {
  36. o.uv.y+= 0.5f;
  37. }
  38. }
  39. else
  40. {
  41. if(unity_StereoEyeIndex == 1) {
  42. o.uv.y+= 0.5f;
  43. }
  44. }
  45. }
  46. else
  47. {
  48. o.uv.x*= 0.5f;
  49. if(_isVidePerversion == 1)
  50. {
  51. if(unity_StereoEyeIndex == 0) {
  52. o.uv.x+= 0.5f;
  53. }
  54. }
  55. else
  56. {
  57. if(unity_StereoEyeIndex == 1) {
  58. o.uv.x+= 0.5f;
  59. }
  60. }
  61. }
  62. returno;
  63. }
  64. fixed4 frag (v2f i) : SV_Target {
  65. return tex2D(_MainTex, i.uv);
  66. }
  67. ENDCG
  68. }
  69. }
  70. Fallback "Mobile/VertextLit"
  71. }


代码分析:

这里添加了两个属性值。

_isUpDownVideo:通过此属性值判断是左右格式的视频,还是上下格式的视频。

_isVidePerversion:通过此属性值判断左右格式或上下格式的视频,图像位置是否正常,因为有些3D视频在制作时,有可能将左边的图像放到了右边;右边的图像放到左边。

 

C#代码修改以上参数方法:

//Shader.SetGlobalInt("_isUpDownVideo", 0);

 

unity_StereoEyeIndex:这个属性值是需要我们重点注意的。

unity_StereoEyeIndex == 0可理解为是左眼看到的屏幕

unity_StereoEyeIndex == 1可理解为是右眼看到的屏幕

通过此数值可以设置不同的UV属性以区分出左右视频图像,从而达到3D视频播放的效果。

使用方式:

1:将原先代码区分左右图像的代码删除,如下图


2:将原先材质Shader修改成我们修改后的VideoStereoShader,如下图所示:


其实这里没有必要再分左右两个视图物体了,只需要保留一个视图物体就可以了。

3:播放实现前,通过设置_isUpDownVideo _isVidePerversion属性值,即可达到正常播放3D视频效果。如果不设置默认为左右格式并且是左右图像正确的视频。

 

注意:VideoStereoShader要和GvrUnityCompatibility.cginc文件放到相同目录:如下图


Shader相关知识自行学习了,加油!!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/915003?site
推荐阅读
相关标签
  

闽ICP备14008679号