VR MultiPass\SinglePass(Instanced)\MultiView 浅析和区分总结

目录

Stereo Rendering

Multi Pass

Single Pass Stereo Rendering单通道立体渲染(双宽渲染)

Single Pass Instanced Rendering单通道(立体)实例化渲染

Multi-view 移动端多视图

性能对比和区别

相关链接


Stereo Rendering

Stereo Rendering(立体渲染)是一种让人眼能感受到立体效果的渲染方式,为给予人眼立体效果,需要2个Camera对同一个场景进行成像,即设置不同的View矩阵渲染两张图像,这两张略有差异的图片能使人眼感觉出深度。(原文链接见最后)

pipeline:

Multi Pass

默认的 Stereo Rendering MethodMulti Pass。此设置较慢,但通常更适合于自定义着色器。如果有自定义着色器,则可能需要更改这些着色器,使之与 Single Pass Instanced 渲染兼容。

多通道渲染运行 2 个完整的渲染通道(每只眼睛对应一个)。因此,与单通道实例化渲染方法相比,多通道方法会产生几乎两倍的 CPU 工作负载。但是,此方法具有最高的向后兼容性,不需要对着色器进行任何更改。

核心思想是提取独立于视图的渲染循环部分。意味着可以共享非依赖单只眼睛视图的资源,比如阴影和剔除。

对于剔除,将两只眼睛的平截头体合为一个做一次剔除,这意味着每只眼睛将比单眼剔除平截头体渲染多一点,但我们认为单次剔除的好处超过了一些额外的顶点着色器、裁剪和光栅化的成本。

pipeline:

Single Pass Stereo Rendering单通道立体渲染(双宽渲染)

Single-Pass Stereo Rendering意味着我们将对整个渲染循环进行一次遍历,而不是两次,或者某些部分两次。

单通道立体渲染功能适合基于 PC 和 Playstation 4 的 VR 应用。该功能可将两只眼睛的图像同时渲染到同一个经打包的双宽渲染纹理,该纹理的宽度是单眼纹理宽度的两倍。(比起切换渲染目标,切换渲染视口开销更小,将左右眼的两张纹理合成为一张双宽的纹理)Unity 针对每个包含渲染器组件的游戏对象使用 2 个绘制调用,从而将场景渲染两次,但是当同时针对左眼和右眼渲染时,Unity 仅对场景迭代一次。在单通道立体渲染期间,双眼共享剔除和阴影计算所需要的工作。图形命令状态更改切换也会减少,因为 GPU 以往返方式(在双眼之间交替渲染对象)渲染每个游戏对象。

单通道立体渲染允许 GPU 针对双眼共享剔除。为了进行剔除,GPU 只需要对场景中的所有游戏对象迭代一次,然后渲染在剔除过程之后仍然存在的游戏对象。

在典型的 OpenGL 立体渲染中,必须按顺序渲染每个眼睛缓冲区,从而使应用程序和驱动程序开销加倍。使用 Single Pass Stereo 渲染,对象被渲染一次到左眼缓冲区,然后自动复制到右缓冲区,并对顶点位置和视图相关变量(例如反射)进行适当修改。它主要是降低 CPU 使用率,而 GPU 性能基本没有变化。

由于两个drawcall之间的缓存一致性,可大大降低 CPU 的使用,并略微减少 GPU 的使用。这样可以大幅降低应用程序的功耗。

下面的比较图显示了普通 VR 渲染和单通道立体渲染之间的区别。

普通立体 VR 渲染:

单通道立体 VR 渲染:

问题:

后处理需要一些额外的工作才能支持单通道立体渲染。每个后期处理效果在打包的渲染纹理(同时包含左眼和右眼图像)上运行一次,但对于在后处理过程中运行的所有绘制命令,这种效果将应用两次:一次是左眼的一半目标渲染纹理,一次是右眼的一半。

后期处理效果不会自动检测单通道立体渲染,所以您需要调整打包的渲染纹理的任何读取操作,使得这些读取操作仅读取对于正在渲染的眼睛来说正确的一面。根据后期处理效果的渲染方式,有两种方法可以实现这一点:

屏幕空间效果是指在预先渲染的图像上绘制的视觉效果。屏幕空间效果的例子包括环境光遮挡景深泛光

例如,假设有一种屏幕空间效果要求在屏幕上绘制一幅图像(也许您正在绘制飞溅到屏幕上某种污垢)。只需要应用这种效果两次:每只眼睛应用一次,而不必将效果应用于整个输出显示,否则将使污垢图像在两只眼睛之间拉伸。在这种情况下,需要从引用整个双宽渲染纹理的纹理坐标转换为引用每只眼睛的坐标。

在单通道下,对于unity,shader需要做额外工作,asset store中的资源很可能无法使用

rift pipeline

pipeline:

在multi pass 中,每只眼睛有自己的rendertarget,但在绘制中切换rt开销十分高,如果选择使用rt数组,在大多数平台上需要将view的相关数据导出到gs外,这个操作也十分消耗性能,所以使用双宽技术,将左右眼纹理绘制在一个纹理上,简单来说,multi pass 切换渲染目标,single pass 切换渲染视口

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。

通过从vs中获取索引可以实现在同一视口渲染多个渲染目标,即无需切换视口

single pass 和 single pass instanced 调用区别:

single pass:

- Draw mesh 1 for left eye
- Draw mesh 1 for right eye
- Draw mesh 2 for left eye
- Draw mesh 2 for left eye

single pass instanced:

- Draw mesh 1 twice, for left eye and right eye
- Draw mesh 2 twice, for left eye and right eye

Multi-view 移动端多视图

多视图是某些OpenGL / OpenGL ES实现的可用扩展,其中驱动程序本身负责处理双眼之间的各个drawcall的多路复用。

有一个与立体声实例化不同的底层实现细节:驱动程序本身确定渲染目标,而不是顶点着色器指定渲染目标数组索引显式选择。其会自动生成一个 gl_ViewID,用于计算视图相关状态,但不用于选择渲染目标。 在使用中,这对开发人员来说并不重要。

multi viwe 与 single pass具有相同架构,开发人员可以使用相同的架构来支持两种single pass技术。

简单来说 multi-view 就是移动端的single pass instanced

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的数量,但是与处理场景图形相比,区别不明显。

技术

原理

缺点

优点

Multi Pass

两个渲染通道,共享剔除和阴影,绘制时切换渲染目标

使用两个通道,双倍的CPU负荷,性能差

高兼容性,

不用改shader

Single Pass

单个通道,使用双宽纹理,绘制时切换渲染视口

对于部分资源和后处理等,可能不支持

性能好

Single Pass Instanced

单个通道,使用双宽纹理,绘制时不切换视口

对于部分资源和后处理等,可能不支持,同时对于部分项目也不兼容

Single Pass

性能好

Multi-view

同SPI

同SPI,用于移动端,需GPU支持

同SPI

相关链接

How to maximize AR and VR performance with advanced stereo rendering | Unity Blog

单通道实例化渲染 - Unity 手册

立体渲染(Stereo Rendering)_linuxheik的专栏-CSDN博客_立体渲染

https://www.facebook.com/photo.php?fbid=10154006919426632&set=a.46932936631.70217.703211631&type=3

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值