使用 Vulkan片段密度图偏移扩展改善焦点渲染
发表于 2022-08-17 11:07:15

本文提及的 Qualcomm 产品由 Qualcomm Technologies, Inc. /或其子公司提供。

Jonathan Wicks 和 Sam Holmes 合写

 Adreno 高性能焦点渲染的演变一文中,我们详细探讨了焦点渲染如何减少 XR 设备的渲染工作量。此外,还介绍了 Vulkan OpenGL 扩展以及骁龙 XR2 平台的最新改进,这些改进减少了带宽,提高了性能,降低了功耗。

我们新开发的 Vulkan片段密度图(FDM)偏移扩展,提供了更多的控制,既能维持帧速率性能,又能实现更佳视觉质量的焦点渲染,下面我们就来详细介绍一下。

优化渲染
为了理解新扩展的工作原理,我们首先回顾一下在移动设备上优化渲染通常所采用的方法。移动游戏一般玩的距离是一个手臂长,运行速度约为 60 帧,每一帧只有 16 毫秒的时间进行渲染。虽然使用移动设备时,部分帧率下降勉强可以接受,但玩家最希望得还是能获得最佳整体帧率。

要满足这一要求,我们可以使用贴图渲染技术,如我们在Qualcomm Adreno GPU 上使用的技术。这种技术将一帧画面分割成一个个图块,依次将每个图块渲染到 GPU 上的高速内存,再传输到系统内存,进行采样及最终显示。整个过程中有一个关键的环节是分块 (bining),要渲染的几何图形被映射到图块上,这样每个图块就能渲染出相应的像素。

XR 中,额外的参数增加了帧速率下降的可能性,也使得渲染效果更加明显。XR 设备的视区靠近用户,立体渲染为每只眼睛渲染一帧,通常为 90 FPS。这样,还有 11ms 的时间用来从两个角度渲染场景两次。此外,还必须避免帧率下降,防止晕屏因此,XR 需要一套自己的技术,最大限度地提高渲染性能。

一种常见的方法是焦点渲染。谈到眼球追踪时会经常讨论到“聚焦”,但也并非必须。由于镜头的内在特性,会在周边发生过度渲染,而“聚焦”有助于对抗这种过度渲染。Adreno 焦点渲染可以控制每个图块的像素着色器的数量,可以将着色集中在最重要的区域。这样,图形管道碎片片段端就节约了大量的开销。

Vulkan OpenGL 中,可以通过 VK_EXT_fragment_density_map(FDM) QCOM_texture_foveated_subsampled_layout 扩展使用此功能。

增加偏移量,实现更精准控制
对于静态焦点映射而言,此功能非常有效,因为映射只需要写一次即可以重复使用。然而,如果映射需要经常更新,就会需要更多 CPU 时间来生成映射,而且映射与图块网格的对齐会导致区域在不同的质量水平之间来回跳动。

为解决这一问题,我们发了 VK_QCOM_fragment_density_map_offset Vulkan 扩展。 此扩展允许您在不更新底层 FDM 附件的情况下,通过细粒度数量更新焦点渲染。换言之,它改变了应用密度值的帧缓冲区位置,而不必重新生成 FDM。这样有效地将内容移到图块网格的后面,对焦点渲染进行多方面调整,并为眼球追踪等应用提供了快速而平滑的过渡,以更新聚焦区域的位置。

下图说明了我们的新扩展是如何平稳控制焦点映射的。

动画显示 FDM 偏移是如何在焦点移动时改善聚焦区的平移的。

扩展的使用
VK_QCOM_fragment_density_map_offset 需要使用到我们前面提到的 VK_EXT_fragment_density_map 扩展,以及 Vulkan 1.2 VK_KHR_create_renderpass2 扩展,以访问 VkEndSubpassInfo 结构。硬件方面,该扩展以 XR2 平台为目标并对其进行了优化,但仅兼容骁龙 865 移动平台及之后的平台(需更新驱动程序)。

偏移量在渲染通道最后一个子通道指定,以尽可能晚地更新偏移量,以减少延迟。我们通过使用所需的偏移量填充 VkSubpassFragmentDensityMapOffsetEndInfoQCOM 结构并通过 VkSubpassEndInfo 结构将其传递给 vkCmdEndRenderPass2,实现上述目的。上述结构接收一个 VkOffset2D 数组值,其中每个值描述 FDM X Y 方向上的期望偏移量。还必须为渲染通道中使用的 FDM 每个层实例化一个 VkOffset2D 。每个偏移量都适用于相应的层。下面的代码显示了如何进行相关设置:

注意:偏移值有对齐限制。对于目前的 Adreno GPU,尤其是在骁龙 865上,这个限值是屏幕/帧缓冲器空间中的 8×8 像素。您必须在运行时使用vkGetPhysicalDeviceProperties2()查询设备属性获取此限值,以填充 VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM 结构。VkExtent2D 字段将分别以 X Y 方向上支持的细粒度进行填充,偏移量必须与此限制一致。下面的代码显示了如何在运行时获取此信息:

最后,帧缓冲区使用的图像创建时都必须用 VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM 标志。所有图像附件都需要如此,包括 FDM 附件、深度缓冲区、颜色附件和解析附件。

开发者提示
FDM 的大小不会随此扩展而变化,而必须适合帧缓冲区的范围。转移 FDM 需要为不再覆盖的帧缓冲区填充图块值。此扩展的行为是对 FDM 边缘值进行拉伸(CLAMP),适合典型的聚焦模式,即外围质量值通常较低。然而,也可以采用其他的策略,例如,设置一个单一的图块边缘值为 0,以利用 Adreno foveation 的图块剔除行为。这样,缺失部分填成 0,从而使 GPU 不再对屏幕上这些部分进行渲染。

使用 FDM 偏移保持聚焦!
FDM 偏移是一种很好的方法,可以在焦点移动时改善焦点渲染的视觉性能。这对于像眼球追踪等场景来说效果更佳,视网膜中央凹快速移动要求快速改变周边区域的质量水平,以确保中央凹边缘的细节的平滑移动。

如需了解有关 Vulkan 的更多信息,请浏览以下资源:

Qualcomm Adreno、骁龙是 Qualcomm Technologies, Inc./或其子公司的产品。

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】