Oculus开发笔记(一)

来源:互联网 发布:atmlh642数据 编辑:程序博客网 时间:2024/05/20 03:46

最近,在使用OculusSDK移植CE3引擎,一方面要去学习CE(以前没用过),一方面看Oculus的文档(也没用过)。刚开始是一头雾水,后来慢慢有些眉目,项目也简单实现了效果,虽然bug还很多,还有很多功能和细节要添加,先在此做个简单小结。

       CE3早期版本的引擎不支持OculusVR设备,在3.8.1之后的才有了支持。但由于以前项目是在早期版本上开发,好多功能都是在其上开发,移植新版本,工作量太大。所有,试用sdk移植是比较合适的方法。一开始看SDK中的例子,现学DX11,看懂例子,然后修改例子中的一些细节,在结合CE3中原有立体显示的实现来开发。

   CE3立体实现有多重组合:stereoDevice 、stereoMode、 stereoOutPut三者组合。主要研究了dual render 和Post Stereo。

dual render:就是场景要绘制两遍,分别对应不同的两个camera,绘制完后,要把绘制结果渲染到一个rendertarget(即RTT),然后将两张纹理合并成一个纹理,最终画到后缓存中。

post stereo:则是场景绘制一般,让后通过对深度缓存做一定的处理,基于原有位置,生成另一只眼睛的图像,效率上比dual render要高,但画质和效果要差点,但帧率高。

   OculusSDK开发流程:

1、初始化设备

2、创建用于RTT渲染的纹理对象

3、创建镜像纹理

4、获取设备数据,设置相机位置

5、将RTT纹理调入渲染对象,并绘制场景

6、将左右眼纹理提交Oculus进行变形处理

7、输出到后缓存中显示

其中,对Oculus的RTT纹理,例子中是需要试用RTT技术,将场景渲染到纹理,再提交给Oculussdk处理。而对于CE引擎本身来讲,这样处理的难度很大,除非对引擎非常熟悉,所以,1绘制两遍场景,对应左右眼,将擎渲染完的场景图像从后缓存copy到tex中;2、将纹理提交sdk变形;3、再将镜像纹理拷贝到后缓存中。

按照这个思路,本单算一部分在引擎底层调用,一部分在以前外提供接口,被外部调用。最后发现处理上还是挺麻烦(要经常试用dx设备),所有又都放在d3d11Render模块中。后来阅读最新CE代码,发现它的实现是重用了dual Render模式,和我的思路比较像,但不同的是,我之前是在引擎之外的实现代码中for循环两次绘制场景,而dual render是在Render内部绘制,当然效率回高很多。所有还是按照这个思路来做(CE开发人员都觉得这样合理,我就更没必要想别的路子了,可定不会比这个好多少)。技术方式定下来,具体的代码移植又是比较麻烦的。最主要是对OCulus没有研究的很透。其中遇到两个比较大的问题:

1、当tex和后缓存纹理大小或纹理格式不匹配,copyResource方法失败,但这个方法竟然没有返回值,我只能将tex保存到file来查看拷贝是否成功。

2、oculus在提交纹理时,如果fov不设置或为零,submitFrame函数就执行失败,mirrorTex不会生产纹理。

对于问题1,采用CopySubresourceRegion方式,或者使用一个纹理对象,设置为渲染对象,将原有纹理渲染到画到一个四边形,从而获取一个适配的纹理。

对于问题2,则需要设置正确的fov就可以了。

0 0
原创粉丝点击