• 最新论文
  • 全国民工子女教育研讨会召开 聚焦城镇化和民工子女教育 “沿河沙子空心李”地理标志证明商标成功注册 专家热议实现教育公平新思路 《恋爱的犀牛》讲述爱与坚持 专家热议实现教育公平新思路 《恋爱的犀牛》讲述爱与坚持 世纪华通再布局,重组盛趣游戏后牵手咪咕文化 建桥学院开展“文明工程”创建月活动 建桥学院开展“文明工程”创建月活动 中国启动制定2035知识产权强国战略纲要 汇桔网赋能高质量发展 研发实战:如何在Oculus Mobile VR平台进行Vulkan开发 香港海下湾海岸公园预计明年启用 游客可以通过VR赏珊瑚 建桥学院开展“文明工程”创建月活动
  • 推荐论文
  • 全国民工子女教育研讨会召开 聚焦城镇化和民工子女教育 “沿河沙子空心李”地理标志证明商标成功注册 专家热议实现教育公平新思路 《恋爱的犀牛》讲述爱与坚持 专家热议实现教育公平新思路 《恋爱的犀牛》讲述爱与坚持 世纪华通再布局,重组盛趣游戏后牵手咪咕文化 建桥学院开展“文明工程”创建月活动 建桥学院开展“文明工程”创建月活动 中国启动制定2035知识产权强国战略纲要 汇桔网赋能高质量发展 研发实战:如何在Oculus Mobile VR平台进行Vulkan开发 香港海下湾海岸公园预计明年启用 游客可以通过VR赏珊瑚 建桥学院开展“文明工程”创建月活动
  • 热门标签
  • 日期归档
  • 研发实战:如何在Oculus Mobile VR平台进行Vulkan开发

    来源:www.zcrchr.com 发布时间:2020-02-01

    来源:Yingwei.com作者颜昌华

    Mobile VR从一开始就使用OpenGL ES作为图形应用编程接口,但现在大多数引擎都转向了Vulkan和DX12等应用编程接口,因为它们给开发者提供了更大的灵活性和更低的渲染负载。Oculus最近介绍了GL和Vulkan在开发虚拟现实游戏功能方面的差异。需要注意的是,本文深入介绍了图形的相关细节,读者需要掌握GL和Vulkan的基本知识。以下是视频网络的具体安排:

    由于肾上腺素图形驱动程序和Oculus运行时的变化,下面描述的大多数功能都需要新发布的Build 7.0版本。

    1。多采样抗锯齿;MSAA)

    与PC机显卡不同,移动芯片组的MSAA由Tiler实现,进行海量运算,然后在平铺完成后进行分析(将所有子样本平均到最终像素),然后将其结果存储在主存中。由于从磁贴存储器到普通存储器的带宽是非MSAA的,这允许我们以与非MSAA近似相同的速度运行MSAA帧缓冲器。这对虚拟现实非常重要,因为每只眼睛的像素很低,导致明显的边缘锯齿。

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

    虽然有效,但由于它的隐式性质,这导致了一系列问题,比如“我认为我的系统不支持MSAA,我的纹理只有RGBA888,我如何才能启用MSAA”。

    在沃尔坎,因为一切都很明确。每个子通道都由一个vkSubpassDescription结构定义,该结构包括pColorAttachments、pDepthStencilAttachment和预解析附件。一个好的Vulkan应用程序应该通过附加4x MSAA缓冲区来设置MSAA,并在颜色/深度附件中使用它作为颜色和深度,在预解决附件中使用非MSAA颜色缓冲区。应用程序应该将pColorAttachments和pdeptstenancetachments store operations设置为vk _ attachment _ store _ op _ done _ care。这将告诉驾驶员:“我将来不再需要这种颜色或深度,请不要将它们存储在平铺存储器中并丢弃它们。”

    额外的一点是,MSAA颜色和深度缓冲区应该设置为瞬态,系统会慢慢分配它们的内存,因为缓冲区甚至没有内存(唯一的东西是预溶解附件(pResolveAttachment)中的颜色分辨率附件)。下面是管道状态的一个很好的例子:

    使用这个路径(通过renderpass/subpass系统的MSAA处理)而不是vkCmdResolveImage路径非常重要。vkCmdResolveImage路径是一个以计算机为中心的应用程序接口,它没有利用Tiler在存储过程中的解析能力。因此,通过vkCmdResolveImage命令执行MSAA的引擎将在内存中存储4x MSAA数据,再次从内存加载到Tiler中,并将非MSAA解析回内存。这很容易给图形处理器增加3毫秒。

    2。多视图)

    这个扩展允许图形处理器驱动程序每次提交时在纹理数组的不同切片上执行绘制调用。它通过虚拟现实中的一次绘制调用在2深度纹理数组中绘制左眼和右眼。通过VK KHR多视图扩展支持Vulkan。它要求颜色、深度和分辨率图像是2D阵列而不是2D,并且需要将vKrenderPassMultiView createInfo结构添加到渲染通道中,以通过多视图来执行。它(在UE4.23中测试)支持多个子信道。renderdoc管道状态图片(同上)显示了带有两个视图(一个用于左眼,一个用于右眼)的多视图捕获。

    vkrenderspassmultivewcreateinfo有一个pViewMasks参数,该参数要求多视图中视图数量的位掩码。对于值为0b11的视图掩码[0],双视图系统要求位0和位1为真。

    我们的运行时本身支持纹理数组作为时间扭曲合成的输入纹理。开发人员应该使用VRAPI _纹理_类型_ 2D _数组枚举来创建纹理,而不是渲染到多视图缓冲区,然后手动将其复制到非多视图图像,并将其发送到VRAPI(计算量很大)。

    3。固定视点渲染;从开发商的角度来看,GL和Vulkan之间的血流储备比率非常不同,因为两个血流储备比率原料药之间的结构差异很大。从概念上讲,FFR是应用于帧缓冲区的渲染设置,因为它修改了GPU计算帧的方式,而不会以任何方式影响纹理(无论发生什么,颜色和深度纹理中的所有纹理元素都将被填充)。

    事实上,来自QCOM的原始FFR扩展应该通过GLFRAMEBUFFFERFOVEATIONCONFIGQCOM函数应用于帧缓冲器,老实说,它应该存在于应用编程接口中。然而,对于Oculus Go,我们希望在不进一步改变引擎/应用程序的情况下引入这一特性。更重要的是,我们希望在运行时控制应用程序的凝视设置,因此我们不需要每个开发人员和引擎来控制FFR设置,整个平台将具有相似的设置。因此,我们要求QCOM将FFR元数据存储在颜色纹理中(由我们控制,因为纹理是在运行时分配的,而不是帧缓冲区),从而产生GltextureFoveationParameterSqcom。从开发人员的角度来看,这个实现在很大程度上隐藏在运行时。开发人员要求FFR级别(关/低/中/高),我们会自动配置较低的级别。

    虽然这个解决方案给围棋和探索带来了相当大的帮助,但它面临着多重挑战。首先,因为它基于VRAPI修改颜色纹理元数据,所以每个预通道(未渲染成颜色纹理)都不基于固定点。现在没有什么大问题,因为我们的大多数应用程序都是单通道的,但是情况总是会改变,例如,因为开发人员希望启用HDR管道。其次,QCOM有一个硬编码的凝视函数模型,它不允许我们根据视野和镜头选择我们真正想要的分辨率曲线。

    Vulkan通过引入VK _ EXT _ fragment _ density _ map extension完全修复了这个问题。需要凝视点渲染的应用渲染通道不使用硬编码公式,而是添加另一个图像附件。它不写附件,而是读附件。该附件是每英寸R8G8像素的图像。与普通附件(1216×1344渲染通道将具有38×42片段密度附件)相比,其分辨率为/32,并驱动应渲染的帧缓冲区的分辨率。

    这是一个片段密度图像的例子。黄色区域是我们的1: 1高分辨率区域。离屏幕中心越远,每英寸的像素就越小。

    虽然上面的纹理具有固定点的形状,但是这个纹理可以是您想要的形状。例如,如果开放世界游戏的开发者不愿意花费太多时间,他们可以完全降低天空的有效分辨率。这对于以方程为中心的总帐扩展来说是绝对不可能的。纹理可以同时绑定到任何渲染通道,因此双通道HDR-LDR渲染器的开发人员可以简单地绑定两个渲染通道中的纹理,并将血流储备分数应用于两个渲染通道。

    考虑到我们仍然希望保持VrDriver对注视点曲线的控制,但是趋势性完全由应用程序控制,所以我们最终采用了混合方法。当开发人员创建交换链以从Vulkan的Oculus运行时获取颜色纹理时,它会创建另一个交换链:注视点交换链,其中颜色交换链的索引0匹配注视点交换链的索引0,依此类推。开发者可以通过新的虚拟现实应用编程接口(VR API _ GettorTerresWapchainbuffFovaInvolkan)函数请求固定点交换链接图像,不需要对其进行任何修改,只需将它们绑定到他们想要启用FFR的渲染通道即可。

    当使用公共血流储备分数控制应用编程接口时,我们的运行时将修改注视点交换链图像并生成注视点图像,其强度对应于开发者请求的设置。以上示例是运行时为高凝视点设置生成的凝视点图像。如果引擎中没有进一步的改变,图像将自动切换凝视曲线,并且下一次渲染过程将使用新的FFR设置,正如开发者使用OpenGLES的FFR扩展一样。

    4。该工具

    Vulkan的一大优势是它是一个由个人电脑和移动设备共享的图形应用编程接口。最重要的是,它是一个无状态的应用编程接口,这意味着驱动程序不需要存储命令之间的底层状态。这极大地帮助了像RenderDoc这样的工具。它支持MSAA,多视图,VK_EXT_fragment_density_map,并且可以在渲染文档1.4之后与Oculus Quest一起使用。片段密度贴图纹理可以在渲染文件(RenderDoc)中可视化,以确保你得到想要的凝视图像,并且帧将包含凝视图像,所以你可以在头部显示中看到真实的纹理输出。

    5.engine

    Oculus 4.22.2版本1.39.0是我们为Vulkan开发推荐的第一个UE4版本。它实现了MSAA、多视图、FFR、sRGB本地渲染和多个UE4-Vulkan漏洞修复。请注意,要访问GitHub中的文件,您需要登录到您的订阅帐户,否则您将看到一个404错误页面。

    我们已经看到相当好的性能提升,SunTemple的开发版本在渲染线程上从16毫秒变为13毫秒。此外,由于着色器是SPIRV预编译的,而不是GLSL着色器,加载速度得到了显着提高。

    不仅速度,Vulkan的优化设计和固有多线程允许我们实现GLES无法支持的功能,例如引擎中每帧的计时器查询。stat单元中的GPU定时器数据现在可用,并由引擎生成的定时器查询驱动,而不是从运行时返回的平均数据,stat gpu为您提供逐渲染通道信息。Vulkan还允许我们开始思考未来的理论功能,例如基于子通道的HDR、多线程着色器加载、简单色调映射等。

    虽然我们发现这个版本和最新的Quest操作系统对于Vulkan来说相当稳定,但是对于UE4-Vulkan-VR来说还处于早期阶段,所以如果您遇到任何问题,请向我们汇报。

    6。样本

    Oculus Mobile样本目录中的VrCubeWorld_Vulkan样本现在已经实现了所有这些功能,您可以参考它并从中获得灵感。

    7。总结

    希望本文能帮助您当前的Vulkan图形开发工作,或者如果您是本地开发人员或UE4开发人员,希望本文能鼓励您尝试使用Vulkan。除了允许您在电脑和移动平台之间轻松共享代码之外,它还可以让您的图形代码工作得更清晰、更快。

    原始链接:https://yivian.com/news/64773.html

    友情链接: