加速 VR 渲染地狱难度进阶篇:降低图形 API 调用次数
准备好,中文互联网终于有人开始严肃地讨论 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 一次怎么解决这个问题呢?
- float4x4 WorldToEyeClipMatrix[2]; // 由 VR 设备的 SDK 获取
- float4 EyeClipEdge[2]={(-1,0,0,1), (1,0,0,1)};
- float EyeOffsetScale[2]={0.5,-0.5};
- uint eyeIndex = SV_InstanceID & 1; // 最低位作为眼睛的索引值:0 为左眼,1 为右眼。
- float4 clipPos = worldPos * WorldToEyeClipMatrix[eyeIndex];
- SV_CullDistanceOut.x = SV_ClipDistanceOut.x = clipPos · EyeClipEdge[eyeIndex];
- clipPos.x *= 0.5; // 渲染范围的宽度缩小一半
- clipPos.x += EyeOffsetScale[eyeIndex] * clipPos.w; // 根据是左眼 or 右眼来向左 or 向右移动
- clipPositionOut = clipPos;
复制代码
正确答案是这段 HLSL Vertex Shader 伪代码,详细的解释留待下一篇文章。
总共十八层的地狱,小张只探索到第四层,等大家打怪练级经验涨上去了,后续关卡会依次开放。
加速 VR 渲染地狱难度进阶篇:降低图形 API 调用次数相关推荐
- OGRE针对图形API调用的效率优化
http://blog.163.com/ding_liang1989/blog/static/168788329201362005946890/ 本文所针对的OGRE版本为1.65,因为本人目前公司项 ...
- C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...
原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...
- C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码
本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...
- C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件),附源码
本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...
- cytoscape.js进阶篇
cytoscape.js进阶篇 系列文章 前言 cytoscape依赖引用 cytoscape扩展依赖引用 升级Cytoscape组件 扩展Cytoscape组件模板容器 扩展Cytoscape组件方 ...
- C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码
我记得,之前在写安卓方面的文章的时候,有人就问过我.Xamarin.Android为什么打包出来这么大?随便一个HelloWord就20-30MB? 嗯..今天我们就来解决这个问题.. 我们先从指定一 ...
- Java面试题-进阶篇(2022.4最新汇总)
Java面试题-进阶篇 1. 基础篇 1.1 基本数据类型和包装类 1.2 Double转Bigdecimal可能会出现哪些问题?怎么解决? 1.3 equals 与 == 的区别? 1.4 Java ...
- 1000篇干货好文!量子技术——进阶篇
阅读原文 1000篇干货好文!量子技术--入门篇 https://bbs.aliyun.com/read/581500.html 1000篇干货好文!量子技术--进阶篇 https://bb ...
- VR技术原理分析,【VR原理入门理论篇】
VR技术原理分析,[VR原理入门理论篇],学习研究VR技术必须要了解的理论知识. 目录 1. VR沉浸感和交互作用产生的原理: 2. 关于沉浸感和交互作用的定义 3. 如何生成符合VR要求的虚拟世界 ...
最新文章
- 胡渊鸣的「太极图形」又融了5000万美元,接下来推出3D内容创作平台
- QT的QMutableSetIterator类的使用
- Ajax — cropper (图片剪裁)基本用法
- ios html 转义字符串,ioS html的转义
- Unity Shader 2D水流效果
- 信息学奥赛一本通 2053:【例3.3】三个数
- php如何获取当前时间
- 问题:自定义Appender输出DCMTK的oflog
- ark服务器修改龙属性代码,方舟生存进化修改恐龙颜色指令代码
- Simpler - 轻量级的微博客户端(开源)
- 超级简单理解工厂模式
- 教你如何设计ASP网上考试系统
- 开博第一篇,为什么要开通博客,开通博客的申请理由
- 毕业论文设置图序号为图1-1,而不是图一-1,同时设置题注方便交叉引用
- vue3笔记十(vue3 tsx使用)
- Python Web前端实战案例——电商网站商品菜单导航栏
- 13个坏习惯让IT工作者过度劳累
- Flyback Converter电源基本电路分析
- xshell启动报nssock2_nssock2.dll下载|
- ipvsadm基本设置
热门文章
- 18-爬虫之scrapy框架请求传参实现的深度爬取(全站爬取)05
- php中td的属性设置,html table表格是什么?table标签中各种属性的使用方法
- 深度学习实践总结:Sentiment Classification How To Frame Problems for a Neural Network
- transient-java 关键字
- For each...in / For...in / For...of 的解释与例子
- BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
- LeetCode 题解之Add Two Numbers II
- linux 服务 启动 关闭 列表
- [Serializable]序列化一句话理解
- SAP用户出口(exit)问题--数据源增强