? 研发实战:如何在Oculus Mobile VR平台进行Vulkan开发 恩华和润_一周_一尘网_www.yczhly.com 亚博线上娱乐平台欢迎您 ,亚博体育88app官网,亚博登录首页
一尘网 - 一周 - 正文

研发实战:如何在Oculus Mobile VR平台进行Vulkan开发

2019-09-12 10:47映维网

来源:映维网?作者?颜昳华

移动VR从一开始就将OpenGL ES作为图形API,但现在大多数引擎都开始转向Vulkan和DX12等API,因为它们为开发者提供了更大的灵活性和更低的渲染负载。Oculus日前介绍了GL和Vulkan在开发VR游戏功能方面的差异。需要注意的是,本文深入介绍了与图形相关的细节,读者需要掌握GL和Vulkan的基本知识。下面是映维网的具体整理:

由于Adreno图形驱动和Oculus运行时方面的改动,下面介绍的大多数功能都需要新发布的Build 7.0版本。

1. 多重采样抗锯齿(Multi-sampling Anti-aliasing;MSAA)

与PC显卡不同,移动芯片集的MSAA是由Tiler执行MASS操作,然后当Tile完成时进行解析(将所有子样本平均到最终像素),再将其结果存储到主存储器。由于从Tile内存到一般内存的带宽是非MSAA,这允许我们以接近与非MSAA相同的速度运行MSAA帧缓冲器。这对VR非常重要,因为每个眼睛的像素非常低,会产生明显的边缘锯齿。

对于GLES,这是通过使用MSAA帧缓冲区将其渲染到非MSAA纹理来完成。MSAA帧缓冲区使用以下函数进行初始化:glFramebufferTextureMultisampleMultiviewOVR

尽管有效,但由于其隐式性质,这引起了一系列的问题,例如“我不认为我的系统支持MSAA,我的纹理只是RGBA8888,我如何启用MSAA”。

在Vulkan中,由于一切都为显式。每个子通道由包含pColorAttachments,pDepthStencilAttachment和pResolveAttachments的vkSubpassDescription结构定义。一个优秀的Vulkan应用程序应该通过附着4x MSAA缓冲区来设置MSAA,并将其用于颜色/深度附件中的颜色和深度,以及pResolveAttachment中的非MSAA颜色缓冲区。应用程序同时应该将pColorAttachments和pDepthStencilAttachments storeOperations设置为VK_ATTACHMENT_STORE_OP_DONT_CARE。这将告诉驱动:“我以后不会要求这种颜色或深度,请不要将它们存储在Tile内存中并丢弃它们”。

加分项是,MSAA颜色和深度缓冲区应该设置为瞬态,并且系统会慢吞吞地分配它们的内存,因为所述缓冲区甚至没有内存(唯一的是pResolveAttachment中的颜色解析附件)。下面是一个优秀的管道状态示例:

使用这一路径(通过renderpass/subpass系统进行MSAA处理)而非vkCmdResolveImage路径非常重要。vkCmdResolveImage路径是一个以PC为中心的API,它不会利用Tiler在存储期间解析的能力,所以通过vkCmdResolveImage命令执行MSAA的引擎会将4x MSAA数据存储在内存中,再次从内存加载到Tiler ,然后将非MSAA解析回内存。这很容易就会给GPU添加3ms。

2. 多视图(Multiviw)

每次提交时,Multiview这个扩展允许GPU驱动程序在纹理数组的N个不同的切片(slice)执行N次绘制调用。它在VR中通过单次绘制调用来在2-deep纹理阵列绘制左眼和右眼。Vulkan通过VK_KHR_Multiview扩展提供支持。它需要颜色,深度和解析图像为2D Array而非2D,并且需要将VkRenderPassMultiviewCreateInfo结构添加到要通过Multiview执行的渲染通道。它(在UE4.23进行了测试)支持多个子通道。renderdoc管道状态图片(与上面相同)展示了具有2个视图的多视图捕获(一个用于左眼,一个用于右眼)。

VkRenderPassMultiviewCreateInfo有一个pViewMasks参数,其要求对多视图的视图数进行按位掩码。对于viewMask[0]值为0b11,双视图系统要求bit0和bit1为真。

我们的运行时本身支持纹理数组作为时间扭曲合成的输入纹理。开发者应该使用VRAPI_TEXTURE_TYPE_2D_ARRAY枚举创建纹理,而非渲染到多视图缓冲区,然后再手动将它们到非多视图图像并发送到VRAPI(计算要求非常高)。

3. 固定注视点渲染(Fixed Foveated Rendering;FFR)

从开发者的角度来看,由于两个FFR API之间存在较大的架构差异,所以GL和Vulkan之间的FFR非常不同。从概念上讲,FFR是一种应用于帧缓冲区的渲染设置,因为它会修改GPU计算帧的方式,同时不会以任何方式影响纹理(无论发生什么,颜色和深度纹理中的所有纹素都会被填充)。

实际上,来自QCOM的原始FFR扩展应该通过glFramebufferFoveationConfigQCOM函数应用于帧缓冲区,而老实说它应该存在于API中。但对于Oculus Go,我们希望在无需深入的引擎/应用改动的情形下引入这项功能。更重要的是,我们希望运行时控制应用的注视点设置,这样我们就不需要每位开发者和引擎来控制FFR设置,并且整个平台上都会具有同类设置。所以,我们要求QCOM在颜色纹理中存储FFR元数据(由我们控制,因为运行时分配纹理而非帧缓冲区),因此诞生了glTextureFoveationParametersQCOM。从开发者的角度来看,这个实现在很大程度上是隐藏在运行时中。开发者请求FFR级别(关闭/低/中/高),而我们自动为他们配置更低的级别。

编辑:陈红

版权与免责声明:

凡未注明"稿件来源"的内容均为转载稿,本网转载出于传递更多信息的目的;如转载稿涉及版权问题,请作者联系我们,同时对于用户评论等信息,本网并不意味着赞同其观点或证实其内容的真实性;


本文地址:http://www.yczhly.com/news/2019/09/12/654905.html

转载本站原创文章请注明来源:一尘网

点击排行
焦点

看上去很火的短视频,对创业者却是个无底洞

  美国杂志《名利场》曾经针对“青少年喜爱的明星”做过一次调 ...详情

Win10系统的便签(便利贴)在哪?

Win10系统更新成2016年周年 版,版本编号1607,。 ...详情

19999元!“小米”自行车来了 史上最贵

啄木网-青岛IT(www.zomiu.com):19999元 ...详情

2月流失20万玩家 绝地求生真的要凉了吗?

《绝地求生》自发布以来可以说是一路飙升,玩家数量每月都有很明 ...详情

万字干货总结:最全的运营数据指标解读

用户获取是运营的起始,用户获取接近线性思维,或者说是一个固定 ...详情

CopyRight ? 2019 www.yczhly.com, All Rights Reserved 一尘网 版权所有

使用一尘网前必读 | 关于我们 | 免责声明 | 隐私政策 | 版权声明 | 联系我们