1、Oculus SDK HMD-ALOG Architecture Terms and definitions VrLib/VrApi目录 Important struct/class ATW线程 HMD-ALOG 反畸变算法(Distortion)多采样着色(Multi-Resolution Shading)反色散(Chromatic Aberration correction,CA)Stereo Rendering 时间扭曲(Timewarp,ATW)位置扭曲(Positional Timewarp)Yaw Correction Sensor Algo(暂时忽略)反畸变/Distortion
2、 VR眼睛看正常2D图像:上图圆圈所覆盖的位置是一样的。从左到右,是一个从边缘往中间内缩的过程。而内缩的幅度,与圆圈的半径,也就是像素点到图像中间的距离成比正比。所以为了从VR的凸透镜看到正常的图形,所以我们需要将原始2D图像经过一些反畸变,再通过眼睛的突变之后恢复成正常图像。经过VR渲染畸变图像:多采样着色(Multi-Resolution Shading)Why?通过上一页我们知道,我们需要做Distortion。但是如果我们按照上张图来实现,就会引入一个问题,我们对每个2D图像每个像素点都进行渲染的话,不但边角毫无意义,主要会造成极大的硬件和软件的资源浪费。How?在中央视区仍保留完整分
3、辨率的情况下,外围视区则用类似于传统后处理阶段的扭曲方式进行渲染。当这一切完成后,同样用户感知效果的图像相比原来的像素数量可减少25%到50%,而像素渲染效率则提升为原来的1.3倍到2倍。反色散/CA Correction 色差(Chromatic aberration;chromatic aberration):色差又称色像差,是透镜成像的一个严重 缺陷,色差简单来说就是颜色的差别,发生在以多色光为光源的情况下,单色光不产生色差。现象:VR头盔在使用时候都会在边缘区域(边缘位置)出现红绿蓝的色边 反色散方法:1.使用低色散的透镜,无法根本解决问题,并且成本还不知道贵不贵 2.软件补偿 Ste
4、reo Rendering 对同一图像需要渲染两次。简单的说,人的双眼看同一物体时,由于左右眼视线方位不同,视网膜上的图像会略有差别,即双眼视差,VR利用双眼视差原理在左右眼屏幕上分别显示两幅具有微小差别的图像,用户将两幅图像融合后得到一幅具有立体效果的图像。时间扭曲/Timewarp 时间扭曲:时间扭曲:是一种图像帧修正的技术,在使用虚拟现实眼睛设备时,由于头部运动过快,而造场景渲染的延迟,即头已经转过去了,但是图像还没有渲染出来,或者渲染的是上一帧的图像,时间扭曲它通过扭曲一副被送往显示器之前图像,来解决这个延迟问题。最基础的时间扭曲是基于方向的扭曲,这种只纠正了头部的转动变化姿势,这种扭
5、曲对于2D图像是有优势的,它合并一副变形图像不需要花费太多系统资源。对于复杂的场景,它可以用较少的计算生成一个新的图像帧。异步时间扭曲:异步时间扭曲:(Asynchronous Timewarp简称ATW)是一种生成中间帧的技术,当游戏不能保持足够帧率的时候,ATW能产生中间帧,从而有效减少游戏画面的抖动,但是,ATW不是灵丹妙药,有一定局限性(局限性在后面介绍),开发人员也应该意识到。指在一个线程(称为称为ATW线程线程)中进行处理,这个线程和渲染线程平行运行(异步),在每次同步之前,ATW线程根据渲染线程的最后一帧生成一个新的帧 时间扭曲/Timewarp 位置扭曲,Positional
6、Timewarp()位置抖动(Positional Judder):位置抖动是最明显的用基于方向的时间扭曲带来瑕疵之一,在使用虚拟现实设备时,当头部移动了,如果在ATW产生图像帧时只考虑了旋转分量,那么任何头部平移分量都将被忽略了。这就意味着当你的头部从一边移动 到另一边时,甚至是旋转你的头并且你的转动眼睛,你讲看见离你很近的物体会有多个图像的抖动,这种效果是非常明显的。()位置扭曲(Positional Timewarp):解决位置颤抖的一个可能的方法是实现全位置扭曲,它应用平移和旋转两个分量来修正原始帧,位置扭曲,位置扭曲需要考虑原始帧的深度信息,由不同的量替代图像的一部分。然而,这样产生
7、的中间帧会使物体边缘不闭合,由于没有原始帧中的数据,会导致中间帧某些区域不能被覆盖。Yaw Correction(脑补翻译)随着时间的改变,可能会方向会产生偏移,但是现实中人的方向还是正前方的。如下图:Architecture Architecture Terms and definitions HMD:Head Monitor Display 头戴式显示器 OVR:Oculus VR CA:chroma aberration 色散 Timewarp:时间扭曲 Distortion:畸变 Pitch,Yaw,Roll:俯仰,偏航,翻转(右手笛卡尔)EGL,OpenGL,JNI,SensorFu
8、sion MIP:纹理特别大的时候,渲染物体小的情况下,效果不好。所以在一开始将纹理按照2的倍数缩小成很多大小不同的纹理,这样我们就可以很快的用任意大小进行纹理贴合。VRApi Dir DirectRender.cpp DirectRender.h Distortion.cpp Distortion.h HmdInfo.cpp HmdInfo.h HmdSensors.cpp HmdSensors.h ImageServer.cpp ImageServer.h LocalPreferences.cpp LocalPreferences.h Sensors OVR_Android_DeviceM
9、anager.cpp SystemActivities.cpp SystemActivities.h TimeWarp.cpp TimeWarp.h TimeWarpLocal.h TimeWarpProgs.cpp VrApi_Android.h VrApi.cpp VrApi.h VrApi_Helpers.h VrApi_local.h Vsync.cpp Vsync.h WarpGeometry.cpp WarpGeometry.h WarpProgram.cpp WarpProgram.h VIP File JAVA:VrActivity.java /实现实现VrActivity接口
10、接口,public class MainActivity extends VrActivity Native:VrApi.cpp,VrApi.h /JNI接口接口 App.cpp,App.h /实现了实现了VrAppInterface基基本接口,以及本接口,以及Class App的接口的接口 Oculus360Videos.cpp eg.Oculus360Videos.h eg./实现这个实现这个app的基本功能接口的基本功能接口 Struct/Class/enum DeviceType:HMDInfo HMDDevice SensorInfo SensorDevice class VrApp
11、Interface Class APP enum DeviceType HMDInfo class HMDDevice 这个机构体代表了HMD这个device,涵盖了基本操作。这个结构体被DeviceManager创建。class SensorInfo Sensor HW本身的一些信息 class SensorDevice virtual void SetCoordinateFrame(CoordinateFrame coordframe)-转换坐标系,将Sensor的坐标系转换成HMD坐标系 class DeviceManager:public DeviceBase class Device
12、Manager:public DeviceBase EnumerateDevices:获取可用的Device,并且把内部指针指向next,再次调用的时候就是第二个DEVICE.Instance:上面就是创建上面就是创建DeviceManager,再有,再有Manager获取第一个获取第一个对应的对应的HMD或者或者Sensor Device,创建它,再操作它。,创建它,再操作它。class VrAppInterface Class App 参考源码:app.h ATW 线程 TimeWarpLocal:TimeWarpLocal:在这个类的构造函数里面实现,即由下面实现。主要功能在WarptoScreen 函数中实现 Wait for sync point Read sensor data Warp both eyes Return the next vsyncbase 演讲完毕,谢谢观看!