一些关于API层面的优化的VR渲染优化方法
2016-07-12 19:43
260 查看
VR渲染需要左右眼两幅不同的画面,现在的大部分引擎都是暴力的直接渲染两遍,这样做想想性能也很难达到75FPS(或90FPS)
以Oculus DK2为例,1920x1080@75FPS,加上Super Sampling就变成了(UE4默认135%)2592x1458@75FPS
如果是Oculus的消费者版本和HTC Vive,分辨率和刷新率更是提升到了2160x1200@90FPS, 推荐配置是GTX980
以140%的Super Sampling为标准的话,只是Color Buffer每秒的数据量就有2160x1200x1.4x1.4x90x4 byte ≈ 1.7GB
这还没算Post Processing里的N多张Render Target和Deferred Rendering的GBuffer、Light Buffer
性能永远是VR渲染的最具有挑战的部分,本着能省一点是一点的思路,VR的渲染优化我总结了这么一些:
虽然VR渲染需要左右两幅画面, 但是有很多效果是不需要画两次的:
Shadow Map
部分的Reflection
Occlusion Query
大多数Post Processing
API层面的优化, 有这么几个思路:
如果实现了多线程的渲染,一般会有一个Command Buffer,直接分别以不同的View提交两次
针对每个物体分别提交两次, 相比上面这个State切换开销会节省一些
使用Geometry Shader直接把Mesh分成左右眼的,drawcall不会翻倍了。但是坑爹的GS性能不咋地
使用Instancing一次drawcall绘制两个Viewport, 跟GS类似,但性能大约是GS的3倍
这只是减少一些API调用、State切换还有Vertex处理的消耗,那瓶颈最大的Pixel处理的消耗怎么减少呢?
Valve使用一个Stencil Mesh, 剔除了17%的像素
NVIDIA的GameWorks也提供了一种方法, 叫Multi-Resolution Shading,大概的思路就是边缘的像素经过变形后会损失一些,另外人眼对视线中心的像素更敏感,所以周围一圈可以降低分辨率来渲染。通过这种方式可以节省25%到50的像素
硬件方面,NVIDIA和AMD都推出了双GPU渲染的支持,即每块GPU渲染一只眼睛的画面。嗯,这一定是个阴谋,他们肯定在偷着乐:这下显卡不愁卖了
SONY的PS VR在PS4的机能下实现了120FPS。听起来不可思议,实际是60FPS通过reproject插值出中间帧,跟Killzone的Temporal
Reprojection 和Oculus的Timewrap差不多原理
参考资料:
Fast
Stereo Rendering for VR - Google Slides - Google Docs
'Advanced VR Rendering' by Alex Vlachos (Valve)
- Steam
GameWorks
VR Presentation - NVIDIA Developer
Asynchronous Timewarp Examined
http://blog.csdn.net/xoyojank/article/details/48719617
以Oculus DK2为例,1920x1080@75FPS,加上Super Sampling就变成了(UE4默认135%)2592x1458@75FPS
如果是Oculus的消费者版本和HTC Vive,分辨率和刷新率更是提升到了2160x1200@90FPS, 推荐配置是GTX980
以140%的Super Sampling为标准的话,只是Color Buffer每秒的数据量就有2160x1200x1.4x1.4x90x4 byte ≈ 1.7GB
这还没算Post Processing里的N多张Render Target和Deferred Rendering的GBuffer、Light Buffer
性能永远是VR渲染的最具有挑战的部分,本着能省一点是一点的思路,VR的渲染优化我总结了这么一些:
虽然VR渲染需要左右两幅画面, 但是有很多效果是不需要画两次的:
Shadow Map
部分的Reflection
Occlusion Query
大多数Post Processing
API层面的优化, 有这么几个思路:
如果实现了多线程的渲染,一般会有一个Command Buffer,直接分别以不同的View提交两次
针对每个物体分别提交两次, 相比上面这个State切换开销会节省一些
使用Geometry Shader直接把Mesh分成左右眼的,drawcall不会翻倍了。但是坑爹的GS性能不咋地
使用Instancing一次drawcall绘制两个Viewport, 跟GS类似,但性能大约是GS的3倍
这只是减少一些API调用、State切换还有Vertex处理的消耗,那瓶颈最大的Pixel处理的消耗怎么减少呢?
Valve使用一个Stencil Mesh, 剔除了17%的像素
NVIDIA的GameWorks也提供了一种方法, 叫Multi-Resolution Shading,大概的思路就是边缘的像素经过变形后会损失一些,另外人眼对视线中心的像素更敏感,所以周围一圈可以降低分辨率来渲染。通过这种方式可以节省25%到50的像素
硬件方面,NVIDIA和AMD都推出了双GPU渲染的支持,即每块GPU渲染一只眼睛的画面。嗯,这一定是个阴谋,他们肯定在偷着乐:这下显卡不愁卖了
SONY的PS VR在PS4的机能下实现了120FPS。听起来不可思议,实际是60FPS通过reproject插值出中间帧,跟Killzone的Temporal
Reprojection 和Oculus的Timewrap差不多原理
参考资料:
Fast
Stereo Rendering for VR - Google Slides - Google Docs
'Advanced VR Rendering' by Alex Vlachos (Valve)
- Steam
GameWorks
VR Presentation - NVIDIA Developer
Asynchronous Timewarp Examined
http://blog.csdn.net/xoyojank/article/details/48719617
相关文章推荐
- 最大公约数和最小公约数
- Java编程思想第四版第十二章学习——通过异常处理错误(1)
- php程序员应具有的7种能力
- leetCode_Flatten Binary Tree to Linked List
- hdu 1019Least Common Multiple(最小公倍数)
- JavaScript中获取表单信息并添加在表格中
- 小学生进位问题
- include标签布局以及自定义标题
- 第2章 一切都是对象
- android TextView、EditText对部分内容设置颜色、字体、超链接、图片
- HDU-1849-Rabbit and Grass【Nim博弈】
- 怎么做能尽量使得自己的孩子不成为熊孩子?
- C# DataTable构造自定义数据的一个使用问题
- Spring 小示例
- CCNU ACM 2016夏季集训·day2比赛
- 欢迎使用CSDN-markdown编辑器
- 【C++】 求两string日期间隔天数
- Mysql 5.7修改密码
- plsql 实现表的创建以及增删改查。
- 针对外部存储器(如磁盘)上存放的程序和数据,说法正确的是()。----阿里巴巴2015校招研发在线笔试题