【VR/AR】如何做个VR播放器
从Facebook收购Oculus之后,VR这个东西就像被点爆了,吸引了各方的极大的关注。我们这里不讨论VR的前景如何,从体验上来说,好的VR产品确实能带来颠覆式的体验。单从这点来看,做为技术人员做好VR的技术储备还是很有必要的。
全民K歌在尝试将K歌和VR结合起来提供颠覆式的录歌体验和直播体验,我们不仅希望不同场景的音效给用户带来耳朵上的享受,更希望用VR技术让用户感受身临其境的录歌和直播体验。这篇文章主要基于我们对VR直播的预研讲下如何在手机上渲染VR视频,即如何做个VR播放器。
我们使用Google的cardboard做预研的VR眼镜:
几个关键的参数:
关键参数如下示意图:
Screen to lens distance(mm)焦距
Inter-lens distance(mm)瞳距
Tray to len-center distance(mm)
Distortion coefficients 畸变参数
Filed-of-View angles (FOV)
这些参数比较直观,这里不再细讲,后面也会说到做个VR播放器,需要涉及的东西还比较多。包括
1、双眼360度全景渲染
2、头部追踪
3、反畸变处理
4、反色差处理
5、减少晕眩感
下面分点讲一下:
GPU渲染的空间坐标系变换流程:
这里最重要的两个坐标变化是Model-View matrix和Projection matrix(这个是opengl最基本的两个变化,这个就不在细说)
在讲双眼360渲染之前,先说下如何做单眼的360渲染,具体的流程大概如下:
1. 创建个球形的模型,包括模型顶点以及跟纹理映射的点等等。
2. 写个shader,将360视频解出来的每一帧贴到球形模型上,这里主要注意的是一般mp4视频的帧都是YUV格式的,需要转成RGB格式的,Opengl只支持RGB格式的纹理渲染。
3. 将camera的位置放在球形模型的球心
4. camera的观看角度随着手机陀螺仪的返回手机姿态角度而变换。
双眼360渲染:
1. 非3D情况下,左右眼的360渲染只是根据inter-lens distance(mm)瞳距做个视角偏移而已。
2. 3D情况这里不做讨论,后续会有专门的文章探讨。
需要注意的是,手机的陀螺仪精度不太够,这里需要比较精细的参数调节,头部追踪过于灵敏或过于迟钝都会造成比较强的晕眩感。
由于VR眼镜用的是凹凸透镜,所以手机屏幕图像经过透镜进入我们的眼镜会有一定的变形失真,造成观看的图像质量的下降,为了防止这样的失真,常见的做法是在图像渲染到手机屏幕之前做个反畸变处理。反畸变的算法如下:
这里可以对每个像素做反畸变计算,然后再做渲染,但是这样做的计算量太大,会造成渲染帧率的下降,更常见的做法如下:
1. 根据反畸变算法计算出密集的网格。
2. 写好shader,将需要渲染的纹理贴到网格上。
3. 让GPU做插值计算。
这样能大大减少计算量。同时可通过控制网格的密集度调整反畸变的图像质量和计算量之间的平衡。
色差产生的原因及处理方案
反色差处理步骤:
1. 在反畸变处理的基础上,反计算屏幕上的一个点映射到纹理上的rgb三个分量在纹理上的位置。
2. 写好shader,在渲染纹理的时候,屏幕上的点对应取的rgb颜色值就由对应的映射到纹理上的3个位置的对应的rgb分量组成。
3. 让GPU自动做插值。
晕眩感是VR里面影响体验最重要的一个因素,在以手机观看VR内容的场景下,减少晕眩感主要有一下几个方便:
1、调整陀螺仪适当的灵敏度-符合人体工程学
2、提高帧率
用非球面镜,减少反畸变和反色差处理。但是同时用非球面镜会减小FOV
做好VR视频分辨率和帧率之间的冲突和平衡
3、减少迅速、突然的交互
VR的体验受多个因素的影响,主要受VR内容的质量以及观看设备影响。对VR内容(以VR视频为例)而言,在不考虑存储和传输的情况下,3D+4K以上的分辨率+25帧以上的帧率+合适的拍摄角度和距离才能提供较好的体验。对观看设备(以手机+VR眼镜观看VR视频为例)而言,60帧的刷新率+单眼2K-3K左右的分辨率+大于90度的FOV+良好的交互体验才能提供比较好的观看体验,以目前市场上主流的手机和VR眼镜来看,都不足以提供比较好的体验。但是相信经过2,3轮的市场迭代,手机和VR眼镜硬件上的限制应该是能被打破。
这篇文章大概介绍了手机上做VR播放器的几个重要的技术点,当然要做好体验还需要做很多的优化和VR眼镜的适配,后续会有文章介绍一些优化的点。
demo:
VR中第一人称射击游戏《Space Pirate Traine》
......
添加小编微信,发送“VR”,可享双重福利
1.加入GAD游戏VR交流圈
获取行业干货资讯
观看大牛分享直播
2.直接领取GAD独家VR资料库
内含
研究报告、游戏制作、项目分享等
全套资料
↓长按添加小编GAD-安琪↓