准备好,中文互联网终于有人开始严肃地讨论 VR 技术了。纯干货文章,直奔主题。

VR 渲染的难点是什么?

左眼和右眼看到的场景是不同的,因此同样的 API 需要调用两次。以 Oculus DK2 为例,头戴显示器分辨率为 1920 X 1080,viewport 均分为左右两部分,各为 960 X 1080。这意味着 CPU 和 GPU 的工作量相比传统三维游戏都要增加,如何降低额外的一次绘制的开销是这篇文章的重点。

VR 地狱有几层?

先来四层:

整个场景画两次:先绘制左眼看到的场景,然后绘制右眼看到的场景。

每个物体画两次:对于场景中的物体依次绘制,物体 1 左眼 -> 物体 1 右眼 -> 物体 2 左眼 -> 物体 2 右眼 -> 按照左右左右的顺序绘制。

硬件 Geometry Shader 技术:只绘制一次,用硬件 Geometry Shader 生成左右两个场景。

硬件 Instancing 技术:只绘制一次,用 instancing 技术生成左右两个场景。

第一层:整个场景画两次

优点 - 最容易实现

缺点 - 效率低下,不论是 CPU 还是 GPU。

左眼渲染结束后,同样的 API 在右眼部分依然需要重复。

第二层:每个物体画两次

优点 - 容易实现,可显著降低 API 调用,域名贴图、Shader、顶点缓存等不用修改。

SV_ViewportIndex 可以用于选择多个 Viewport。

缺点 - draw call 依然存在重复。

仅仅需要修改右眼的摄像机的状态(View Matrix)和 视口(Viewport)。

第三层:硬件 Geometry Shader 技术

优点 - 看上去很美,硬件加速,不需要重复 API 调用。

缺点 - 需要修改 Shader 流水线以支持 GS,同时部分硬件平台不支持 GS,而且 GS 的效率非常糟糕(某显卡:怪我咯)!

第四层:硬件 Instancing 技术

优点 - 不涉及额外的状态切换,比 GS 快三倍!

缺点 - 不支持两只眼睛渲染到不同到 render target 上(暂时不是问题),同时老版本的 GLES 不支持

Instancing。Instancing 的特点是 CPU 只上传一次顶点数据,让 GPU 批量渲染多次。也就是场景中所有物体的 Vertex Buffer、Index Buffer、Texture 以及渲染状态只设置一次,一个物体也仅仅 draw 一次。

但是前面提到左右眼的 View Matrix 和 Viewport 是不同的,只 draw 一次怎么解决这个问题呢?

  1. float4x4 WorldToEyeClipMatrix[2]; // 由 VR 设备的 SDK 获取
  2. float4 EyeClipEdge[2]={(-1,0,0,1), (1,0,0,1)};
  3. float EyeOffsetScale[2]={0.5,-0.5};
  4. uint eyeIndex = SV_InstanceID & 1; // 最低位作为眼睛的索引值:0 为左眼,1 为右眼。
  5. float4 clipPos = worldPos * WorldToEyeClipMatrix[eyeIndex];
  6. SV_CullDistanceOut.x = SV_ClipDistanceOut.x = clipPos · EyeClipEdge[eyeIndex];
  7. clipPos.x *= 0.5; // 渲染范围的宽度缩小一半
  8. clipPos.x += EyeOffsetScale[eyeIndex] * clipPos.w; // 根据是左眼 or 右眼来向左 or 向右移动
  9. clipPositionOut = clipPos;

复制代码

正确答案是这段 HLSL Vertex Shader 伪代码,详细的解释留待下一篇文章。

总共十八层的地狱,小张只探索到第四层,等大家打怪练级经验涨上去了,后续关卡会依次开放。

加速 VR 渲染地狱难度进阶篇:降低图形 API 调用次数相关推荐

  1. OGRE针对图形API调用的效率优化

    http://blog.163.com/ding_liang1989/blog/static/168788329201362005946890/ 本文所针对的OGRE版本为1.65,因为本人目前公司项 ...

  2. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

  3. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  4. C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  5. cytoscape.js进阶篇

    cytoscape.js进阶篇 系列文章 前言 cytoscape依赖引用 cytoscape扩展依赖引用 升级Cytoscape组件 扩展Cytoscape组件模板容器 扩展Cytoscape组件方 ...

  6. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码

    我记得,之前在写安卓方面的文章的时候,有人就问过我.Xamarin.Android为什么打包出来这么大?随便一个HelloWord就20-30MB? 嗯..今天我们就来解决这个问题.. 我们先从指定一 ...

  7. Java面试题-进阶篇(2022.4最新汇总)

    Java面试题-进阶篇 1. 基础篇 1.1 基本数据类型和包装类 1.2 Double转Bigdecimal可能会出现哪些问题?怎么解决? 1.3 equals 与 == 的区别? 1.4 Java ...

  8. 1000篇干货好文!量子技术——进阶篇

    阅读原文 1000篇干货好文!量子技术--入门篇  https://bbs.aliyun.com/read/581500.html    1000篇干货好文!量子技术--进阶篇  https://bb ...

  9. VR技术原理分析,【VR原理入门理论篇】

    VR技术原理分析,[VR原理入门理论篇],学习研究VR技术必须要了解的理论知识. 目录 1. VR沉浸感和交互作用产生的原理: 2. 关于沉浸感和交互作用的定义 3. 如何生成符合VR要求的虚拟世界 ...

最新文章

  1. 胡渊鸣的「太极图形」又融了5000万美元,接下来推出3D内容创作平台
  2. QT的QMutableSetIterator类的使用
  3. Ajax — cropper (图片剪裁)基本用法
  4. ios html 转义字符串,ioS html的转义
  5. Unity Shader 2D水流效果
  6. 信息学奥赛一本通 2053:【例3.3】三个数
  7. php如何获取当前时间
  8. 问题:自定义Appender输出DCMTK的oflog
  9. ark服务器修改龙属性代码,方舟生存进化修改恐龙颜色指令代码
  10. Simpler - 轻量级的微博客户端(开源)
  11. 超级简单理解工厂模式
  12. 教你如何设计ASP网上考试系统
  13. 开博第一篇,为什么要开通博客,开通博客的申请理由
  14. 毕业论文设置图序号为图1-1,而不是图一-1,同时设置题注方便交叉引用
  15. vue3笔记十(vue3 tsx使用)
  16. Python Web前端实战案例——电商网站商品菜单导航栏
  17. 13个坏习惯让IT工作者过度劳累
  18. Flyback Converter电源基本电路分析
  19. xshell启动报nssock2_nssock2.dll下载|
  20. ipvsadm基本设置

热门文章

  1. 18-爬虫之scrapy框架请求传参实现的深度爬取(全站爬取)05
  2. php中td的属性设置,html table表格是什么?table标签中各种属性的使用方法
  3. 深度学习实践总结:Sentiment Classification How To Frame Problems for a Neural Network
  4. transient-java 关键字
  5. For each...in / For...in / For...of 的解释与例子
  6. BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
  7. LeetCode 题解之Add Two Numbers II
  8. linux 服务 启动 关闭 列表
  9. [Serializable]序列化一句话理解
  10. SAP用户出口(exit)问题--数据源增强