| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> VR MultiPass |SinglePass(Instanced) |MultiView 浅析和区分总结 -> 正文阅读 |
|
[游戏开发]VR MultiPass |SinglePass(Instanced) |MultiView 浅析和区分总结 |
目录 Single Pass Stereo Rendering单通道立体渲染(双宽渲染) Single Pass Instanced Rendering单通道(立体)实例化渲染 Stereo RenderingStereo Rendering(立体渲染)是一种让人眼能感受到立体效果的渲染方式,为给予人眼立体效果,需要2个Camera对同一个场景进行成像,即设置不同的View矩阵渲染两张图像,这两张略有差异的图片能使人眼感觉出深度。(原文链接见最后) pipeline: Multi Pass默认的 Stereo Rendering Method 为 Multi Pass。此设置较慢,但通常更适合于自定义着色器。如果有自定义着色器,则可能需要更改这些着色器,使之与 Single Pass Instanced 渲染兼容。 多通道渲染运行 2 个完整的渲染通道(每只眼睛对应一个)。因此,与单通道实例化渲染方法相比,多通道方法会产生几乎两倍的 CPU 工作负载。但是, 核心思想是提取独立于视图的渲染循环部分。意味着可以共享非依赖单只眼睛视图的资源,比如阴影和剔除。 对于剔除,将两只眼睛的平截头体合为一个做一次剔除,这意味着每只眼睛将比单眼剔除平截头体渲染多一点,但我们认为单次剔除的好处超过了一些额外的顶点着色器、裁剪和光栅化的成本。 pipeline: Single Pass Stereo Rendering单通道立体渲染(双宽渲染)
单通道立体渲染功能适合 单通道立体渲染允许 GPU 针对双眼共享剔除。为了进行剔除,GPU 只需要对场景中的所有游戏对象迭代一次,然后渲染在剔除过程之后仍然存在的游戏对象。 在典型的 OpenGL 立体渲染中,必须按顺序渲染每个眼睛缓冲区,从而使应用程序和驱动程序开销加倍。使用 Single Pass Stereo 渲染,对象被渲染一次到左眼缓冲区,然后自动复制到右缓冲区,并对顶点位置和视图相关变量(例如反射)进行适当修改。它主要是降低 CPU 使用率,而 GPU 性能基本没有变化。 由于两个drawcall之间的缓存一致性,可大大降低 CPU 的使用,并略微减少 GPU 的使用。这样可以大幅降低应用程序的功耗。 下面的比较图显示了普通 VR 渲染和单通道立体渲染之间的区别。 普通立体 VR 渲染: 单通道立体 VR 渲染: 问题: 后处理需要一些额外的工作才能支持单通道立体渲染。每个后期处理效果在打包的渲染纹理(同时包含左眼和右眼图像)上运行一次,但对于在后处理过程中运行的所有绘制命令,这种效果将应用两次:一次是左眼的一半目标渲染纹理,一次是右眼的一半。 后期处理效果不会自动检测单通道立体渲染,所以您需要调整打包的渲染纹理的任何读取操作,使得这些读取操作仅读取对于正在渲染的眼睛来说正确的一面。根据后期处理效果的渲染方式,有两种方法可以实现这一点:
屏幕空间效果是指在预先渲染的图像上绘制的视觉效果。屏幕空间效果的例子包括环境光遮挡、景深和泛光。 例如,假设有一种屏幕空间效果要求在屏幕上绘制一幅图像(也许您正在绘制飞溅到屏幕上某种污垢)。只需要应用这种效果两次:每只眼睛应用一次,而不必将效果应用于整个输出显示,否则将使污垢图像在两只眼睛之间拉伸。在这种情况下,需要从引用整个双宽渲染纹理的纹理坐标转换为引用每只眼睛的坐标。
rift pipeline pipeline: 在multi pass 中,每只眼睛有自己的rendertarget,但在绘制中切换rt开销十分高,如果选择使用rt数组,在大多数平台上需要将view的相关数据导出到gs外,这个操作也十分消耗性能,所以使用双宽技术,将左右眼纹理绘制在一个纹理上,简单来说, Single Pass Instanced Rendering单通道(立体)实例化渲染使用单通道实例化 (Single Pass Instanced)渲染(也称为立体实例化)的情况下,由 GPU 执行单个渲染通道,将每个绘制调用替换为实例化绘制调用。 Single Pass Instanced使用render target array进行实现,眼睛纹理共享格式和大小,以此在rt数组中使用。在扩展的图形api接口中,从顶点着色器导出渲染目标数组索引的功能变得越来越常见,借此我们可以指定要渲染到render target 数组的哪个纹理上。利用现有的single-pass double-wide结构,使用unity中的unity_StereoEyeIndex,在着色器中填充SV_RenderTargetArrayIndex。
single pass 和 single pass instanced 调用区别: single pass: - Draw mesh 1 for left eye single pass instanced: - Draw mesh 1 twice, for left eye and right eye Multi-view 移动端多视图多视图是某些OpenGL / OpenGL ES实现的可用扩展,其中驱动程序本身负责处理双眼之间的各个drawcall的多路复用。 有一个与立体声实例化不同的底层实现细节:驱动程序本身确定渲染目标,而不是顶点着色器指定渲染目标数组索引显式选择。其会自动生成一个 gl_ViewID,用于计算视图相关状态,但不用于选择渲染目标。 在使用中,这对开发人员来说并不重要。 multi viwe 与 single pass具有相同架构,开发人员可以使用相同的架构来支持两种single pass技术。
OpenGLES支持ovr_multiviwe2扩展https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview.txt 性能对比和区别single pass(instanced) 与 multi pass之间cpu开销有显著的区别。 但是,单通道和单通道实例化之间的差异相对较小。 原因是通过将multi pass切换到single pass已节省了大量CPU开销。单通道实例化确实减少了draw call的数量,但是与处理场景图形相比,区别不明显。
相关链接How to maximize AR and VR performance with advanced stereo rendering | Unity Blog 立体渲染(Stereo Rendering)_linuxheik的专栏-CSDN博客_立体渲染 https://www.facebook.com/photo.php?fbid=10154006919426632&set=a.46932936631.70217.703211631&type=3 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 16:26:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |