在英特尔® 处理器显卡上使用可变速率着色

签署人: Adam T Lake IDZSupport KS Laura Wieme Reznikov Marissa du Bois 已发布: 12/26/2019 最后更新时间: 12/02/2019

摘要

在本白皮书中,我们介绍了全新的可变速率着色 (VRS) 硬件功能。这项新功能最初作为一种全新渲染算法在 2014 年 High-Performance Graphics 上展示,我们将其称作 粗糙像素着色。如今,第 11 代英特尔® 处理器显卡标志着它的首次公开实施,展示了如何将着色和可见性分离,通过对最重要的像素进行着色,最大限度地改善性能和用户体验。我们介绍了如何在您的应用中使用 VRS 以及如何利用全新的可变速率着色 API,这款 API 在 Windows* 19H1 版 Microsoft DirectX* 12 中提供。在本文的姊妹篇中,我们还提供了一个 VRS Tier 1 功能代码示例,以展示在您的应用中使用 VRS 的步骤,并提供了更多技术详细信息,以供参考。

image comparison 1 by 1 and 2 by 2 pixel rate
图 1.左侧图像是以 1x1 的像素率将标准 Citadel 1 图像渲染为 2560 x 1440,右侧图像使用可变速率着色以 2x2 的速率渲染。虽然 VRS 减少了着色器调用的数量,但是在高像素密度显示屏上几乎看不到明显的差别。此处还显示了未应用抗锯齿的放大图像,与渲染成 1280x720 的图像进行对比。转载已获得 Vaidyanathan 等人的许可(High-Performance Graphics 中的粗糙像素着色,2014)。

简介

本白皮书介绍了一项基于硬件的全新技术,这项技术之前被称作粗糙像素着色 (CPS),现在被称作可变速率着色 (VRS)。14在 2014 年 High Performance Graphics 上,这项技术作为一个研究项目首次公开亮相,如今,新一代英特尔 GPU 将为其提供硬件支持。3, 11 图 1 中的左图为使用 1x1 像素率渲染为 2560x1440 的图像,右图为使用 VRS 以 2x2 的速率渲染的图像。虽然 VRS 减少了着色器调用的数量,但是在高像素密度显示屏上几乎看不到明显的差别。

首先,我们总结了 VRS 和我们正在研究的多个用例。接下来简要介绍之前开发的软件技术,描述它们与新硬件特性之间的区别。然后描述 API 的详细信息并展示最新英特尔 GPU 硬件上的一个示例。最终,我们介绍了目前使用 VRS 遇到的一些限制。

如欲了解性能详情和我们正在研究的更多用例,包括集成至 Unreal Engine*、粒子系统和景深,请观看我们的 2019 年图形和交互技术特别兴趣小组* (SIGGRAPH*) 演示:使用可变速率着色改进用户体验。(Lake 等,2019)7

supported shading rates
图 2.英特尔支持上图的着色速率。DirectX 12 VRS 规范仅要求支持 1x1、2x1、1x2 和 2x2 着色速率,但是我们还支持可选的 2x4、4x2 和 4x4 着色速率。红点表示在粗糙像素着色器中执行像素着色器评估的位置,评估的结果被广播到渲染目标的黄色位置,假设是一个完全覆盖的粗糙像素。

什么是可变速率着色?

可变速率着色是指不受着色器目标分辨率和光栅化速率的影响,指定像素着色器调用率的能力。VRS 支持我们改变在本地区域内对像素进行着色的次数。在本实施中,我们允许将 X 和 Y 方向的着色速率降至 1/2 或1/4,如图 2 所示。我们可以分别控制 X 和 Y 维度,以支持高于基础着色速率的更多速率,如 1x2、2x1、2x2、2x4、4x2 和 4x4。DirectX* 12 可变速率着色规范中的可选着色速率包括 2x4、4x2 和 4x4。(Microsoft 2019b )12

如图 3 所示,我们从 Microsoft DirectX 12 SDK 示例中修改了多线程示例,以便在远离摄像头的特定几何中利用 VRS。在远处,很难察觉对象的着色速率下降。利用这一点,我们可以提升应用的性能,不会引起任何明显的质量损失。

图 4 显示了一个 VRS 细节级别 (LOD) 的示例,图片来自 Crytek* Sponza 中的场景。4

select geometry v r s multithreading example
图 3.我们修改了 Microsoft DirectX 12 SDK 示例中的多线程示例,以便在在远离摄像头的特定几何中利用 VRS。在远处很难察觉对象的着色速率下降。利用这一点,我们可以提升应用的性能,不会引起任何明显的质量损失。

examples using direct x 12 v r s
图 4.来自 Crytek* Sponza 场景的示例 VRS 细节级别 (LOD),

可变速率着色的重要性

发布粗糙像素着色的原版时,英特尔预测 1080p 及以上的显示屏密度将成为消费者平台的主流配置,现在这一预测已变为现实。但是,当前 GPU 的原始性能无法始终与执行吞吐量保持同步,因此难以渲染当前显示屏中的像素数量。VRS 是一项重要的渲染技术,这类技术通过加强对降低着色速率的控制,提供高质量视觉效果,同时维持场景的视觉保真度。

在像素受限时,使用软件技术提升帧速率

在详细描述 VRS 之前,首先,我们将概述几项目前流行的软件技术,这些技术可降低游戏引擎架构师对像素着色的要求。本文提及的两种方法为动态分辨率渲染 (DRR) 和棋盘渲染 (CBR)。

简言之,DRR 用于对屏幕外可变大小的渲染目标(每一帧的尺寸都不同)进行渲染,然后将该动态渲染目标扩展为最终的固定尺寸帧缓冲器,以进行展示。在升级后的 DirectX 12 实施中,我们利用既定资源来简化实施,无需处理最右侧和底部边缘的滤波器锁定,而之前的实施必须执行该操作。我们更新了 Binks (2011) 的初步实施,并在 SIGGRAPH* 2018 大会上展示了这项工作,在博文中描述了对原始论文的升级(Mcferron 和 Lake 2018a,Mcferron 和 Lake 2018b)。9, 10

CBR 技术的灵感来自其他游戏开发人员在该领域的先前工作(De Carpentier 2017,El Mansouri 2016,Wihldal 2017)。1, 8, 15 我们的实施在解析阶段合成了两个四分之一分辨率(高度和宽度一半的分辨率)2xMSAA 图像,其中,重建算法用于恢复两帧中不可见的对象。相比 DRR,MSAA 平面为我们提供了更多的深度和覆盖样本,有助于提高几何边缘的质量。

由于这两个实施均在 Microsoft DirectX 12 MiniEngine 的分支中完成,我们能够通过结合这些技术,获得更高的性能。请谨慎选择支持结合 DRR 和 CBR 的渲染目标尺寸。如果您对这些基于软件的技术感兴趣,建议您查询参考资料,获得更多详情和性能结果。目前,它们以开源的方式提供,并且经过测试,可在集成和独立 PC GPU 上运行。

软件技术的限制

之前描述的软件技术在当今的硬件上提供了极大的灵活性。DRR 可轻松、灵活地集成到现有的渲染解决方案,但是它有几个缺点。最重要的是,颜色、深度和覆盖样本数量与 DRR 渲染目标的比例是 1:1,我们必须将渲染目标上采样与过滤为屏幕分辨率,这有可能引发模糊。在实践中,当渲染目标大于等于渲染目标分辨率的 70% 时,这项技术会取得良好的效果。

如前所述,我们的 CBR 实施使用两个抖动的 2xMSAA 四分之一分辨率平面来重新构建场景,其视口与背靠背帧相同。相比两个二分之一分辨率统一样本模式图像,这些抖动的样本提供了更高的质量。此外,我们引入了重构阶段,以便恢复运动状态下的对象。由于我们拥有两个信息帧,因此,我们能够使用重构着色器,有效维持相同的总样本数。在 MiniEngine 中渲染 Sponza 场景时,相比 1080p 原始分辨率,当前的开源实施将速度提升了 1.18 倍,每帧比原始渲染节省约 5 毫秒。

为了克服软件解决方案中的不足,我们考虑通过基于硬件的技术来降低总体像素吞吐量要求,但是不排除结合使用两项技术。

在像素受限时,使用硬件技术提升帧速率

我们在前文介绍了软件技术对开发人员的重要价值,实际上,我们可以通过硬件加速技术实现更高的性能和质量。为此,GPU 厂商和研究人员正在开发硬件特性,以便在渲染性能无法满足内容创作者的需求时,更好地利用着色资源。目前已经发布了自适应多频着色(Clarberg,2014)、可变速率着色和多速率着色(He,2014)等多项技术。2, 6

VRS 通过降低着色速率提升性能,相比之前描述的软件技术,它可以在渲染目标的每帧保存更多覆盖和深度信息。这意味着将着色资源用在最需要的地方。

控制可变速率着色速率的方法

根据 Vaidyanathan 等人(2014) 的描述,我们可以通过几种方法来控制着色速率:14

  1. 为后续的绘制调用设置 VRS 速率。可以对每帧进行多次更新。
  2. 创建一个输入遮罩,后者可用于读取屏幕特定区域的 VRS 速率。您可以将该遮罩想象成一个覆盖图像,位于我们在帧缓冲器中创建的图像之上。这被称作 Tier 2 VRS,当前的第 11 代英特尔® 处理器显卡硬件不支持该功能。
  3. 在每个像素区域对参数描述进行评估,并用参数描述来确定 VRS 速率。这通常用于描述 VR 和其他场景中使用的中心凹区域。VRS API 目前不支持该模式。如果您对此感兴趣,请联系我们,一同讨论英特尔注视点模式扩展的使用。请注意,在第二种方法中,可以使用正确的图像遮罩模拟参数注视点模式。
  4. 为场景中的每个顶点设置 VRS 速率,并选择在整个多边形中插入值。
  5. 将这些模式与用户定义的功能相结合。

当前的第 11 代英特尔处理器显卡实施支持以上第 1 点和第 3 点。它还支持 Microsoft 可变速率着色 Tier 1 规范(随 Windows 10 19H1 一起发布),我们将该 API 用于本白皮书中的功能测试应用。该 API 可提供全面的灵活性,这是支持多种 VRS 用例所必须的。

VRS 的用例

虽然 VRS 的支持仍处于早期阶段,但是新出现的硬件和 API 可以为我们提供真正的性能优势。我们想要探索以下领域,并确定如何为游戏开发人员提供最大的优势。我们在 SIGGRAPH 2019 大会上展示了部分初期结果,请参见参考资料部分。

  1. 远处的对象:相比临近摄像头的对象(如果该对象被放置在临近视口的位置),远离摄像头的对象可能不需要那么多细节,尤其在对象被大雾或气候效果遮挡的情况下。
  2. 运动中的对象:对于运动中的对象,很难察觉着色复杂度的细微变化,因为在人类视觉系统看来,这些对象都是模糊的。因此,昂贵的 GPU 周期实际上浪费在用户察觉不到的视觉保真度上。
  3. 出现模糊或视觉失真的对象:引擎使用任意数量的技术来实现游戏体验方面的艺术目标。运动模糊、散景效果、热焦散、雾和其他大气效果将使图像内容变得模糊或失真。如果我们事先知道这些效果将使渲染内容失真,我们可以降低视觉保真度。节省下来的像素着色器执行时间可以花费在其他像素上,或者被计入总体帧速率提升。
  4. 用户视觉边缘的对象:中心凹区域是眼球中心周围的区域,大约有 5 度(Guenter 等人,2012)。人类视觉系统无法识别该区域之外的细节;因此,花时间渲染这个区域的大量细节是徒劳无益的。如果我们跟踪视线,会了解用户注视的地方,然后设置我们的渲染管道,将大部分渲染时间用在中心凹区域,而不是边缘区域。即使没有视线跟踪场景,集中渲染特定区域也具有重大价值,方法是将特定区域标记为高度重要,然后使用中心凹参数渲染相应的场景子集。在本示例中,图形工作者还可以选择一个 VRS 偏差,将其用于他们认为不重要的对象或材料。
  5. 已知具有缓慢变化照明参数的对象:在某些场景(如独具特色的卡通主题)中,对象的参数在多个像素之间平稳变化。这些参数非常适合使用 VRS。如果没有 VRS,对于无法在本地控制像素着色速率的情境,我们将其过度着色为硬件实施的伪影。
  6. 动态分辨率渲染:VRS 可用于动态分辨率渲染场景,在该场景中,我们以较高分辨率将中心凹区域固定在屏幕中心,然后减少分辨率和中心凹区域的尺寸,以维持目标帧速率。如果您未达到目标,可以通过缩小中心凹区域的尺寸来实现目标帧速率。当您超过目标时,需要增加中心凹区域。
  7. 节能:使用每像素 naïve 方法计算比屏幕尺寸更少的颜色值时,可以降低功耗。这对于移动场景至关重要,因为在移动场景中,电池续航时间是一个重要因素。

在应用中使用 VRS API

开始使用 VRS 前,请确保平台支持 VRS。以下代码片段展示了如何在平台上查询 VRS 支持级别。VRS 仅在 Windows® 10 版本 19H1(也被称作 Windows 10 版本 1903)及更高版本中提供,只能在支持 VRS 的硬件上使用。构建样本需要安装最新版 Windows SDK。该样本经过验证,可使用 Microsoft Visual Studio* 2017 进行编译。

可通过以下步骤启用 VRS,以执行特定绘制调用或渲染器的代码区:

  1. 设置:将您的命令列表修改为 ID3D12GraphicsCommandList5 的实例。ID3D12GraphicsCommandList5 中的相应函数表可用于在渲染期间设置 VRS 光栅状态。
    // Modify ID3D12GraphicsCommandList to use ID3D12GraphicsCommandList5 
    // ComPtr<ID3D12GraphicsCommandList> m_commandList; // Does not support VRS Tier 1
    ComPtr<ID3D12GraphicsCommandList5> m_commandList; // Supports VRS Tier 1
    
  1. 初始化:打开您的应用时,请检查 与 Tier 1 的兼容情况。这将确保您只在支持 VRS 的平台上执行 VRS 特定调用。
    // Declare struct to store feature data.
    D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
    
    // Request Supported Features from D3D12 Device.
    m_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS6, &options, sizeof(options));
    
    // Check for VRS Tier 1 Support or Use Fallback.
    if(options.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_1)
    {
        // Variable Rate Shading Tier 1 Supported
        m_VRSTier1Enabled = true;
    }
    else
    {
        // Variable Rate Shading Tier 1 Unsupported
        m_VRSTier1Enabled = false;
    }

    还需要通过查询来验证是否支持其他着色速率。英特尔支持扩展的 VRS 速率集,包括 2x4、4x2 和 4x4。第 11 代英特尔处理器显卡支持这些着色速率,请务必在英特尔® 平台上的应用中充分利用这些特性。
    // Additional Shading Rate Check
    if(options.AdditionalShadingRatesSupported == true)
    {
        // Additional Shading Rates are Supported
    }
    else
    {
        // Additional Shading Rates are Unsupported
    }
  1. 每帧或每调用:如欲修改着色速率,请使用命令列表中的调用对其进行设置
    // Call RSSetShadingRate from ID3D12CommandList5 with the appropriate shading rate.
    if(m_VRSTier1Enabled == true)
    {
        m_commandList->RSSetShadingRate(D3D12_SHADING_RATE_4X4, nullptr);
    }

    着色速率由 D3D12_SHADING_RATE 枚举定义:

    enum D3D12_SHADING_RATE
    {
        D3D12_SHADING_RATE_1X1 = 0x0, // No change to shading rate
        D3D12_SHADING_RATE_1X2 = 0x1, // Reduces vertical resolution 2x
        D3D12_SHADING_RATE_2X1 = 0x4, // Reduces horizontal resolution 2x
        D3D12_SHADING_RATE_2X2 = 0x5, // Reduces both axes by 2x
        D3D12_SHADING_RATE_2X4 = 0x6, // Reduce horizontal res 2x, vertical by 4x
        D3D12_SHADING_RATE_4X2 = 0x9, // Reduce horizontal res 4x, vertical by 2x
        D3D12_SHADING_RATE_4X4 = 0xA, // Reduces both axes by 4x
    };

请注意:2x4、4x2 和 4x4 是另外提供的着色速率,并非所有平台都支持这些速率。

  1. 每帧或每调用:以特定着色速率完成调用后,您可以通过 D3D12_SHADING_RATE_1X1 调用 RSSetShadingRate,重新设定着色速率。
    // Call RSSetShadingRate from ID3D12CommandList5 to reset your shading rate.
    if(m_VRSTier1Enabled == true)
    {
        m_commandList->RSSetShadingRate(D3D12_SHADING_RATE_1X1, nullptr);
    }
    通过在尽可能广泛的范围内调用 RSShadingRate 来避免性能损失,或者按照着色速率对绘制调用进行分类,从而避免过于频繁地改变光栅状态。
  1. 一般而言,关闭应用需要拆除某些基础设施,但是在 VRS 中,不需要销毁活动对象或释放内存。它真的非常易于使用。

Tier 1 VRS 的限制

使用 VRS 时,应用开发人员应注意 Tier 1 VRS 的几个已知行为:

  • 如果 SV_Coverage 被声明为 VRS Tier 1 的着色器输入或输出,那么着色速率将降至 1x1。
  • SampleMask 必须为全遮罩。如果 SampleMask 被配置为其他形式,着色速率将降至 1x1。
  • EvaluateAttributeAt[Centroid|Sample|Snapped] 不兼容 tier 1 VRS。如果使用这些内部函数,着色速率将降至 1x1。

对于第 11 代英特尔处理器显卡,我们建议尽可能减少着色速率变化。当前的实施要求在着色速率变化之间进行局部管道刷新。明智地对具有相似着色速率的对象进行分组,以获得最佳性能,避免不必要的开销。

VRS 问答

本部分提供了几个常见问题解答。建议您查看参考资料部分引用的 SIGGRAPH 2019 演示。

MSAA 如何与 VRS 交互?

虽然 MSAA 有一些限制,但是它可以与 VRS 搭配使用。MSAA 将继续以 MSAA 样本速率对覆盖和深度进行采样,但是将以特定的 VRS 速率对样本进行着色。SV_Coverage 可与 VRS 一起使用(如果它不会编译失败或引发错误),但是如果它用于着色器,着色速率将降至 1 x 1。

VRS 如何改变 Mip-Map LOD 选择?

使用 VRS 选择的 mip-map 反映了较大的像素尺寸。因此,选择的 mip-map 将迁移到更低的分辨率 mip 层,以反映更粗糙的分辨率像素。如果高级着色器语言 (HLSL) 需要使用 SampleBias() (Microsoft,2019)获得更高或更低质量的 mip-map,可以对其进行调整。13

镜面锯齿如何?

虽然开发人员在 VRS 迁移前尽最大努力避免镜面高光伪影或蹿出 (popping),但是迁移至更粗糙的像素分辨率会加剧其恶化,这取决于实施详情。可能需要对滤波器进行更新,才能考虑低分辨率像素。

可变速率着色实践

该示例应用展示了如何使用 VRS API。它在第 11 代英特尔处理器显卡和 NVIDIA Turing* 架构上运行,展示了运动中的对象。应用将 VRS 用作细节级别系统的一部分。可在 Github* 上获取这些资源。

图 5 和 6 展示了如何在第 11 代英特尔处理器显卡上使用 DirectX 12 VRS API。

examples using direct x 12 v r s a p i
图 5.一个简单的功能示例,改编自 Microsoft DirectX 12 示例。

spheres animated to rotate around a plane
图 6.该场景对球体设置动画效果,使其围绕地平面中心旋转,并分别以 1x1(接近摄像头)和 4x4 (远离摄像头)的速率将两个不同的球体放大。在实践中,您可以在离摄像头足够远的位置进行转变,并且通过大气效果模糊化,这样,任何像素速率的蹿出都不会被察觉。我们在之前参考的 SIGGRAPH 2019 演示中讨论了这项工作。

致谢

特别感谢 Javier Martinez 指导我们入门;感谢 Stephen Junkins 进行早期审核;感谢 Mike Burrows、Dave Astle、Josh Doss 和 Radoslav Vecera 对接下来工作的支持;感谢驱动程序团队的 Adam Kunka 解答我们的问题,感谢 Chuck Lingle 对我们工作的鼓励;感谢 Kai Xiao 提出新的想法并帮助我们解决高难度的技术问题;感谢 Karthik Vaidyanathan 和 VTT ART 团队对首次出版和硬件计划的贡献,为粗糙像素着色带来新的动力。感谢 Mark Dabrovic 构建 Sponza 模型。

参考资料

  1. Giliam de Carpentier,Kohei Ishiyama,游戏中的实时渲染高级课程:Decima 引擎:照明和 AA 的进步, (SIGGRAPH*,2017)
  2. Petrick Clarberg,Robert Toth,Jon Hasselgren,Jim Nilsson,Tomas Akenine-Moller,AMFS:面向未来图形处理器的自适应多频着色,(SIGGRAPH,2014),第 33(4) 卷。
  3. Ian Cutress, 2018 年英特尔架构日:未来的内核,英特尔 GPU,10 纳米和混合 x86,(2018 年 12 月 12 日)
  4. Crytek* Sponza 场景,(Cryteck,2018)
  5. B. Guenter,M. Finch,S. Drucker, D. Tan,J. Snyder。注视点 3D 图形。ACM Transactions on Graphics (2012)
  6. Yong He,Yan Gu 和 Kayvon Fatahalian,使用自适应多速率着色扩展图形管道。ACM Transactions on Graphics,3,4 (2014)。142:1–142:12。
  7. Adam Lake,Filip Strugar,Kelly Gawne 和 Trapper McFerron, 使用可变速率着色 (VRS) 在实时游戏引擎中提升用户体验,(SIGGRAPH,2019)
  8. Jalal El Mansouri,渲染《彩虹六号围攻》。(游戏开发者大会,2016)
  9. Trapper McFerron 和 Adam Lake,采用棋盘渲染在英特尔集成显卡上进行实时升级,(2018)
  10. Trapper McFerron 和 Adam Lake,面向 Microsoft DirectX* 12 的动态分辨率渲染更新,(2018)
  11. 可变速率着色:大锤世界中的手术刀,(2019 年 3 月 18 日)
  12. DirectX 规范:可变速率着色
  13. Texture2D:SampleBias 方法
  14. Karthik Vaidyanathan,Marco Salvi,Robert Toth,Tim Foley,Tomas Akenine-Möller,Jim Nilsson,Jacob Munkberg,Jon Hasselgren,Masamichi Sugihara,Petrik Clarberg,Tomasz Janczak 和 Aaron Lefohn。高性能显卡中的粗糙像素着色。(2018 9–18.)
  15. Graham Wihlidal,《战地 1》和《Mass Effect Andromeda》中的 4K 棋盘。(游戏开发者大会,2017)
  16. Kai Xiao,Gabor Liktor 和 Karthik Vaidyanathan,采用时间超级采样的粗糙像素着色,I3D ’18: 交互式 3D 图形和游戏研讨会,(I3D '18,2018)

产品和性能信息

1

英特尔的编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。这些优化包括 SSE2、SSE3 和 SSSE3 指令集和其他优化。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于微处理器的优化仅适用于英特尔微处理器。某些非特定于英特尔微架构的优化保留用于英特尔微处理器。关于此通知涵盖的特定指令集的更多信息,请参阅适用产品的用户指南和参考指南。

通知版本 #20110804