骁龙Spaces XR开发分享:实现更好的注视点渲染图像质量和帧率性能
实现更好的注视点渲染视觉质量,并同时保持帧率性能
(映维网Nweon 2022年09月07日)注视点渲染可以减少XR设备的渲染工作量。为了进一步减少带宽、提高性能和降低功耗,高通一直在积极地进行研究探索,成果包括Vulkan和OpenGL的扩展。
日前,主要负责注视点渲染和Vulkan的XR图形团队成员乔纳森·坦安姆(Jonathan Tinkham)撰文介绍新开发的Fragment Density Map Offset Extension for Vulkann。据介绍,这个扩展可以为你提供更多的控制,从而帮助你实现更好的注视点渲染视觉质量,并同时保持帧率性能:
1. 优化渲染
要了解这个新扩展,我们首先回顾一下移动设备渲染通常是如何优化的。一款典型的手游是在臂展长度之内开玩,速度约为60 FPS,每帧渲染时间仅为16ms。尽管这种媒介可以接受一定的帧率下降,但玩家渴望尽可能好的整体帧率。
满足所述要求的一种技术是Tile-Based Rendering,例如高通Adreno GPU使用的技术。它将一帧分为多个Tile区块,每个Tile区块依次渲染到GPU的高速内存中,然后传输到系统内存进行采样和最终显示。这个过程的一个关键组成是binning,其中要渲染的几何体映射到Tile,以便每个Tile渲染适当的像素。
在XR中,附加参数会增加帧率下降的可能性。对于XR设备,视口靠近用户,立体渲染涉及每只眼睛一帧,通常为90 FPS。这使得从两个角度渲染场景两次的时间为11ms。另外,为了帮助防止晕动症,你必须避免帧率下降。显然,XR需要自己的一套技术来最大化渲染性能。
一种常见的方法是注视点渲染。注视点通常需要眼动追踪。这项功能非常有利于对抗由于透镜特性而在周边出现的过度渲染。Adreno注视点渲染提供了对每个Tile着色像素数的控制,并可以将着色集中在最重要的区域。这可以在图形管道的片段端实现大量的节省。
这个功能在Vulkan和OpenGL中分别通过VK_EXT_fragment_density_map (FDM) 和QCOM_texture_foveated_subsampled_layout扩展提供。
2. 提供更精细的控制
这对静态注视点Map的效果非常好,因为map只需编写一次并重复使用。但是,如果需要经常更新Map,则可能需要额外的CPU时间来生成Map,并且Map与Tile网格的对齐可能会导致来回出现不同的质量级别。
为了解决这个问题,团队为Vulkan发布了VK_QCOM_fragment_density_map_offset扩展。这个扩展允许你按细粒度量更新注视点渲染而无需更新底层FDM attachment。换言之,它会更改应用密度值的帧缓冲区位置,而无需重新生成FDM。这将有效地将内容移动到Tile网格后面,从而对注视点渲染进行调整,并为眼动追踪等应用提供快速平滑的过渡,以更新注视点区域的位置。
下图说明了新扩展如何实现对注视点Map的平滑控制:
3. 扩展的使用
VK_QCOM_fragment_density_map_offset需要前述的VK_EXT_fragment_density_map扩展,以及Vulkan 1.2或VK_KHR_create_renderpass2扩展来访问 VkEndSubpassInfo struct。
offset在渲染通道的最后一个子通道中指定,它将尽可能晚地更新offset 量以减少延迟。这是通过用所需offset填充VkSubpassFragmentDensityMapOffsetEndInfoQCOM structure并通过VkSubpassEndInfo struct将其传递给 vkCmdEndRenderPass2来实现。所述struct采用VkOffset2D值数组,其中每个值描述FDM在X和Y方向的所需offset。必须为渲染通道中使用的FDM的每一层实例化VkOffset2D。每个offset都应用于相应的层。以下代码显示了如何设置这一选项:
VkOffset2D offsets[2] = {}; offsets[0].x = //… VkSubpassFragmentDensityMapOffsetEndInfoQCOM offsetInfo = { VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM, 2, // fragmentDensityOffsetCount; 1 for each layer/multiview view offsets, // offsets are aligned to fragmentDensityOffsetGranularity }; VkSubpassEndInfo subpassEndinfo = {}; subpassEndInfo.pNext = &offsetInfo; // Only offets given to the last subpass are used for the whole renderpass // Offsets given in other subpasses are ignored vkCmdEndRenderPass2(VkCommandBuffer commandBuffer, &subpassEndInfo);
注意:offset有对齐限制。对于当前的Adreno GPU,尤其是骁龙865,屏幕/帧缓冲区空间中的像素数为8 x 8。你必须在运行时以编程方式获取这个限制,通过使用vkGetPhysicalDeviceProperties2()查询物理设备属性以填充VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM struct。VkExtent2D字段将分别在X和Y方向填充支持的粒度,offset量必须与所述限制对齐。以下代码显示了如何在运行时获取相关信息:
VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM offsetProperties = {} VkPhysicalDeviceProperties2 properties = {}; Properties.pNext = &offsetProperties; vkGetPhysicalDeviceProperties2(pDevice, &properties); offsets[0].x = align(offsets[0].x, offsetsProperties. fragmentDensityOffsetGranularity.width);
最后,帧缓冲区中使用的所有图像必须使用VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM flag创建。这在所有图像attachment都是必需项,包括FDM attachment、深度缓冲区、颜色attachment和解析attachment。
4. 提示
FDM的sizing不会随此扩展而改变,FDM的size必须适合帧缓冲区范围。变换FDM需要为帧缓冲区中不再覆盖的部分填充Tile值。然而,其他策略可能合适,例如将单个Tile边缘值设为0以利用Adreno注视点的Tile排除行为。这将用0填充缺失的部分,从而导致GPU跳过这些部分的渲染。
当焦点移动时,上述方法是提高注视点渲染视觉性能的好方法。这在眼动追踪等情况下尤其如此,注视点的快速移动需要快速改变边缘区域的质量水平,从而确保边缘细节的平滑移动。
------------
伴随骁龙Spaces XR开发者平台正式面向全球开发者开放,为了更好地服务中国AR/VR开发者生态,并为骁龙Spaces XR平台寻找优秀的潜在合作伙伴。“2022 Qualcomm XR创新应用挑战赛(参赛点击前往)”发起了“骁龙Spaces XR平台开发者问卷调查(点击前往)”。
参与问卷调查的优秀开发者(点击参与)更有机会获得高通创投的骁龙元宇宙基金支持,以及与高通公司在骁龙Spaces XR生态平台上达成深度合作,赋能并支持整个生态系统的创新。另外,参与问卷调查的合格提交者均有机会获得高通官方提供的“骁龙Spaces XR”专属T恤等礼品。