英伟达概述如何为VR集成注视点渲染+可变速率着色VRS
查看引用和消息源请点击:nvidia
轻松集成VRS注视点渲染
(映维网 2019年05月31日)每一代的VR头显都能实现大幅度的提升。然而,分辨率,刷新率,视场,以及其他功能都产生了独特的挑战。为了应对所述的问题,NVIDIA VRWorks Graphics SDK一直在提供各种不同的渲染技术。例如英伟达图形所带来的可变速率着色(Variable Rate Shading;VRS),它能够改变一帧中的着色率。
下图所示的眼动追踪是新一代VR头显的又一个关键功能。诸如Vive Pro Eye等商业设备已经集成了眼动追踪,而英伟达这为VRS集成提供了进一步的动力,因为着色资源可以集中于注视点区域。在本文中,英伟达的Swaroop Bhonde主要讲解了集成注视点VRS的简单方式,并且介绍了VRS Wrapper NVAPIs。下面是映维网的具体整理:
1. 图灵架构中的可变速率着色
英伟达图灵架构带来了可变速率着色(VRS)这项功能。通过改变应用于图像不同区域的处理资源,VRS可以平衡渲染性能和渲染质量。这种全新的着色技术能够改变单个像素着色器所处理的像素数目,而所述操作现在已经可以应用于像素块,支持应用程序有效地改变屏幕不同区域中的着色质量。在渲染表面时,通过近似输出至头显的透镜校正图像,VRS能够更有效地渲染VR场景,因为这可以避免渲染在图像输出至VR头显之前会被丢弃的像素。VRS同时可以结合眼动追踪,根据用户注视点进一步优化渲染质量。
我们先前的博文已经介绍了VRS的基础内容,而这一次我们将主要介绍包含VRS Helper和Gaze Handler APIs的VRS Wrapper。
英伟达为Maxwell和Pascal架构推出了VR渲染优化功能,包括多分辨率着色(Multi-Res Shading;MRS)和透镜匹配着色(Lens Matched Shading;LMS)。与前面所述的方法相比,VRS可以提供更佳的边缘保持。为了进一步说明VRS的优势,图2比较了VRS和MRS与LMS的视觉质量。
2. 注视点渲染
对于头显分辨率的每一次提升,这都意味着GPU需要渲染的像素数目同样有所增加。为了维持流畅的VR体验,我们必须继续寻找优化VR渲染性能的新方法。集成眼动追踪的头显提供了提升视觉质量和性能的新方法。这是因为人类眼睛对视场各个位置的感知质量都所有不同。如图3所示,视锥细胞的数量与眼睛的敏锐度密切相关。
人眼只能在非常狭窄的视场区域中感知到最高的细节,我们将这里称为中央凹。位于注视点区域的外围视场通常比较模糊,人眼所能感知的细节较少。VRS注视点渲染利用了这一生理特性,集中资源渲染注视点区域的画面,同时降低外围视场的渲染质量。通过这样的方式,注视点渲染能够提升头显的视觉感知质量,并且帮助维持高帧率。VRS注视点渲染可以支持开发者根据现代头显提供的注视点输入来改变着色率。
VRS为开发者实现注视点渲染提供了大量的工具。然而,原来的NVAPI对VRS的支持依然需要开发者付出的繁重的工作量才能有效地实现注视点渲染。现在,最新版本的NVAPI版本已经提供了简化VRS注视点渲染实现的工具。
3. VRS Helper和Gaze Handler
最初发布的low-level VRS NVAPI为VR渲染提供了完全可定制的功能。新版VRS Wrapper NVAPI则可允许开发者以更少的代码为应用程序集成注视点渲染。
VRS Wrapper由下面两个接口组成:
- VRS Helper:用于控制注视点渲染参数
- Gaze Handler:采集和管理眼动追踪数据
表1对比了low-level VRS APIs和VRS Helpers Wrapper NVAPIs。
4. VRS Regions VRS区域
在深入介绍设置VRS Helper的细节之前,我们先来看看一个关键概念:VRS区域。图4说明了着色率是如何根据注视点的不同而变化。着色率是指4×4光栅像素块中的着色器采样数量。改变一帧中的着色率意味着我们在不同的注视区域改变采样。
图4中的深蓝色区域对应于中央凹区域或眼睛注视点。中心蓝色区域具有最高的着色率,其次是青色区域,以及外围红色区域。这允许开发者保持高水平的感知视觉质量,同时不会对帧速率产生不利影响。VRS允许开发者将不同的着色率烘焙到应用程序中。但是,这可能需要大量的编码工作。这正是VRS Helper发挥作用的时候。
5. VRS Helper可助你轻松利用预设和自定义
VRS Helper简化了注视点渲染的实现,同时没有放弃灵活性。VRS Helper允许你选择以下内容来执行注视点渲染。
- 易于使用的内置预设:这提供了集成注视点渲染的最快方式。你无需深入到任何数字参数,同时仍然提供了一定的灵活性。
- 完全可定制的预设。对于自定义预设,你可以自定义大多数内部参数,完全按照自己的方式执行注视点渲染。
预设的选择在Enable()调用本身进行,因此你可以根据任何与游戏相关的因素来动态更改预设。你同时可以在VRWorks Graphics SDK Sample应用程序中探索所述的预设
6. 内置着色率预设
表2列出了五个内置预设,你可以使用其中一个来设置注视点渲染的着色率。例如,2×2表示由像素着色器调用评估的单个着色将复制在2×2像素的区域中,从而实现粗略着色。另外,诸如4×SS(4×超级采样)之类的着色率表示像素着色器将调用多达4次。
7. 内置注视点图案预设
你可以从图4中的三个内置预设中选择一个注视点图案。
8. 自定义预设
着色率和注视点图案可以完全自定义。你可以在各个设置中选择“Custom”预设来完成。选择“Custom”着色速率预设允许你自定义每个区域的着色率。图5和图6是相关的菜单选项。
选择“Custom”注视点图案预设允许你指定三个同心椭圆的半径,如图7所示。半径值的相对比例是从0.0到1.0。对于位于窗口中心的椭圆,半径为1.0将跨越窗口的宽度(或高度)。半径(1.0,1.0)始终表示渲染目标中的完美圆形拟合,在矩形的情况下仅接触两个长边。
图8描述了自定义预设参数:
9. 平衡版预设:提升质量并最小化性能影响
与传统的桌面端渲染相比,VR带来的其中一个额外挑战是,VR显示器的每度像素数通常少于桌面显示屏。所以VR渲染更容易受到锯齿伪影的影响。另外,在渲染中尽可能多地提供细节对于提升沉浸式体验而言至关重要。开发者需要处理各种渲染伪影,尤其是锯齿。对于这个问题,我们可以使用多重采样渲染目标和MSAA来柔化对象的边缘。
如果应用程序选择多重采样渲染目标/MSAA,执行超采样可以进一步提升渲染的质量。超采样可以提高锐度,并且可以为高频纹理带来更好的抗锯齿效果,而这时简单的MSAA所无法做到的事情你个。对于超采样,像素着色器在像素内的每个采样位置运行,而非每像素只运行一次。
如果没有VRS,应用程序必须为整个渲染目标执行超采样。由于像素着色器负载增加,这会对GPU产生非常大的压力。由于VRS Helper可以仅在注视点区域执行超采样,所以应用程序能够提高质量,同时最小化性能影响。
另外,“平衡版”着色率预设在非常外围的区域执行2×2的粗略着色。这反过来可以为中心超采样腾出一定的GPU性能。
所述的平衡版预设是通过结合下面两个设置实现:
- 着色率平衡预设。在注视点域执行4x超采样,在中间区域执行1x,并在外围执行2x2粗略着色。
- 注视点图案平衡预设。确保注视点区域足够大,使得外围区域位于在大多数用户的瞬时视场之外。
与全屏超采样相比,采用VRS Wrappers和平衡版预设的注视点渲染展示出非常明显的优势,具体请参阅下面图9的性能图表:
如图所示,采用“平衡版注视点”和“着色率”预设可以提升注视点区域的质量,同时能够保持较高的性能。
10. 编码VRS Wrapper APIs
VRS Wrapper APIs允许你使用VRS Helper和Gaze Handler接口编码注视点渲染。
10.1 初始化VRS Helper
要执行进一步的操作,你需要首先初始化VRS Helper。这个过程会返回一个用于调用其他关键函数的接口对象。
10.2 初始化Gaze Handler
如果眼动追踪器运行时或VR运行时没有实习Gaze Handler,应用程序则必须自行初始化,并在眼动追踪器获取时更新注视点数据。
10.3 更新注视点数据
应用程序可以在并行线程中一直更新注视点数据:
10.4 闩锁(Latching)注视点
VRS Helper需要应用程序标记一帧的开始,亦即驱动程序闩锁最新注视点,并将其用于余下绘制调用的位置。
10.5 启用平衡版预设的注视点渲染
然后,在开始绘制调用之前应用程序需要启用注视点渲染。注视点渲染保持启用,直至应用程序予以禁用。
10.6 禁用注视点渲染
在完成注视点渲染所需的所有绘制调用后,应用程序应该禁用注视点渲染。然后,应用程序可以执行后处理和其他渲染任务,如注视点渲染应该予以禁用的离屏渲染。
更多关于NVAPIs的信息请参阅VRWorks SDK包中的NVIDIA Variable Rate Shading Helpers Programming Guide PDF文件。
11. 如何获取?
NVIDIA VRWorks Graphics 3.2 SDK已经纳入了VRS Wrapper APIs。开发者可以尝试包含其中的示例,并在自己的应用程序中实现VRS Wrapper。
值得一提的是,HTC为Vive Pro Eye创建了一个集成VRS Wrapper NVAPIs的Unity插件。借助这个插件,你只需点击几个按钮即可快速集成VRS注视点渲染。