高通XR分享:Adreno GPU的注视点渲染功能发展
注视点渲染旨在降低VR场景所需的计算能力
(映维网 2021年08月02日)注视点渲染旨在降低VR场景所需的计算能力。人眼注视中心凹的分辨率最高,而我们外围视觉在细节和颜色方面则较低。注视点渲染的目标是利用这一特点,只以高分辨率为中心凹渲染,亦即人眼注视点区域,然后大幅降低外围视觉的的场景复杂度。
日前,高通XR业务的战略和合作伙伴负责人布莱恩·福格尔桑(Brian Vogelsang)及同事撰文介绍了Adreno GPU的注视点渲染功能发展,下面是映维网的具体整理:
虚拟现实头显单独为用户的每只眼睛渲染视图,从而将用户沉浸在数字世界之中。
开发者可以使用注视点渲染来优化渲染性能,以满足VR对帧率和分辨率的高要求。注视点渲染是一种减少像素着色成本的技术。如图1所示,只在人眼注视区域以高分辨率渲染画面,外围则采用低分辨率。这可以减少渲染每个帧所需的时间和/或功率。
尽管传统的注视点渲染一般都会涉及眼动追踪,但后者并非必要项。大视场和平面投影会导致边缘过度渲染(见图2)。另外,异步时间扭曲用于对抗透镜畸变的桶形畸变会导致外围采样不足。所以为了减少这种过度渲染,今天的VR一体机会采用固定注视点渲染(FFR)。
注视点渲染提高了性能,为开发者提供了优化整体分辨率、帧速率和/或着色复杂度的灵活性,以提供更好的视觉质量和更好的用户体验。
1. 对注视点追踪的支持
高通Adreno自骁龙821移动平台发布以来就一直支持注视点渲染,并且随着骁龙移动平台的发展而不断提升,包括用于Oculus Quest的骁龙835移动平台,以及用于Oculus Quest 2提的骁龙XR2。
团队已经通过QCOM_texture_foveated扩展在OpenGL提供了注视点渲染功能,而Vulkan则是通过VK_EXT_fragment_density_map扩展。另外,高通基Qcom_texture_foveated的QCOM_texture_foveated2增加了丢弃屏幕区域的功能。
要支持Adreno GPU实现高效、高性能的注视点渲染,一个关键功能是Tile Based渲染方法。这种基于图块的注视点渲染将帧划分为一个个的图块,每个图块按顺序渲染到GPU的高速内存。当一个图块完成,最终结果就会发送到系统内存,而GPU将渲染下一个图块。这样,只需把最终帧内容复制到系统内存即可。应用程序为构造帧而执行的读取和重写操作都是利用本地高速存储器来完成。下面,我们将讨论Adreno的Tile Based注视点渲染的发展。
2. 标准的Tile Based注视点渲染
在骁龙XR2平台之前,标准的Tile Based注视点渲染是在高速GPU内存中渲染较低的分辨率,然后在将图块复制到系统内存时upscaling结果,如图3所示:
3. 提升Tile Based注视点渲染
对于骁龙XR2平台,团队通过增强的Tile Based注视点渲染过程来实现更高的质量、更低的带宽使用率和更高的性能:系统内存只存储低分辨率的图块数据,并仅在采样时重新创建upscale数据,如图4所示:
这种子采样布局减少了内存带宽,并允许选择性upscaling,从而获得更好的视觉质量。开发者只需在OpenGL中启用QCOM_texture_foveated_subsampled_layout扩展,或者在Vulkan中启动VK_EXT_fragment_density_map扩展即可。
我们来回顾一下它对于注视点渲染的意义:
-
质量:仅在采样期间upscaling低分辨率数据可以提高双线性滤波的质量,因为系统内存中的相邻像素现在包含true相邻数据。另外,由于注视点纹理通常是利用异步时间扭曲进行采样,亦即执行桶形畸变,所以upscaling仅在显示所需的位置发生。
-
带宽:随着分辨率的不断提高,节省带宽变得越来越重要,尤其是功率效率至关重要的一体机。通过只将所需的数据写入并读入系统内存,骁龙XR 2的注视点渲染增强解决了所述问题。将低分辨率图块数据存储在内存中会减少渲染期间的写入带宽,并且在对纹理进行采样时同样会减少读取带宽。对于XR内容,团队表示通常可以看到读取带宽节省约30%到40%。
-
性能:与骁龙835相比,骁龙XR2显著提高了性能。对于XR内容,团队表示通常可以看到2-3倍的性能改进。根据程度而定,性能提升可高达4倍。这可允许VR应用开发者能够使用骁龙XR2实现更高的帧速率和分辨率。
随着眼动追踪技术变得越来越普遍,通过移动中心凹的焦点来跟随具有最高分辨率的中心凹,并在较少细节的外围区域减少着色,可以实现对FFR的进一步改进。
4. 对于引擎开发者
目前,众多虚拟现实开发者都使用Unity和Unreal来构建沉浸式虚拟现实环境,而Oculus提供了相应的SDK来为所述两个系统执行FFR。所述SDK包括填充注视点参数的API,以便开发者能够专注于解决High Levep问题。例如,Unity的OVRManager类允许开发者将FFR设置为几个预定义的细节级别。有关更多信息,请查看Oculus的Unity FFR文档和标Unreal FFR文档。