青阳网>点击>正文

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

2019-09-07 11:31:36 映维网 分享

查看引用/信息源请点击:映维网

Oculus正在大力推广Vulkan的采用

映维网 2019年08月09日)移动VR从一开始就将OpenGL ES作为图形API,但现在大多数引擎都开始转向Vulkan和DX12等API,因为它们为开发者提供了更大的灵活性和更低的渲染负载。Oculus日前介绍了GL和Vulkan在开发VR亚博登录注册--任意三数字加yabo.com直达官网功能方面的差异。需要注意的是,本文深入介绍了与图形相关的细节,读者需要掌握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计算帧的方式,同时不会以任何方式影响纹理(无论发生什么,颜色和深度纹理中的所有纹素都会被填充)。

声明:本站部分资源来源于网络,版权归原作者或者来源机构所有,如作者或来源机构不同意本站转载采用,请通知我们,我们将第一时间删除内容。本站刊载文章出于传递更多信息之目的,所刊文章观点仅代表作者本人观点,并不意味着本站赞同作者观点或证实其描述,其原创性及对文章内容的真实性、完整性、及时性本站亦不作任何保证或承诺,请读者仅作参考。
编辑:小青