这篇文章介绍了 NVIDIA GPU 上可变速率着色的最佳实践。要在应用程序中获得高且一致的帧速率,请参阅所有 高级 API 性能提示 .
可变速率着色( VRS )是一种图形功能,允许应用程序独立于渲染目标的分辨率来控制像素着色器调用的频率。它有 D3D12 和 Vulkan 两种版本。
定义 VRS 费率
根据您选择的 API ,您最多可以有三个选项来定义 VRS 费率:
- 每支取一次的通话费
- 按原始利率计算
- 从屏幕空间阴影率图像中查找,可以在屏幕的不同区域定义不同的速率
按抽签通知
这个选项是最容易实现的,只需要在命令流中进行几个额外的 API 调用,而不需要额外的依赖项。它是最粗的粒度,因此可以将其视为“最宽的画笔”
每基元
此选项需要增加几何资产,因此可能需要更改资产在 art 管道中的生成方式或应用程序加载和准备的方式。利用你正在绘制的知识,根据你的需要精确调整着色速率。
屏幕空间查找
此选项需要渲染管道更改,但通常不需要资产或艺术品更改。
最困难/有趣的问题是如何生成着色率图像:
- 例如, NVIDIA Adaptive Shading ( NAS )使用运动矢量数据和颜色变化数据来确定图像的哪些部分需要较少的细节。
- 为了有用,生成着色率图像的算法的性能成本必须小于 VRS 的性能节约。
- 尝试对渲染引擎已经生成的数据(例如,运动矢量或前一帧结果)使用便宜的算法。
推荐
- 继续使用现有的图形优化技术。 VRS 并没有从根本上改变图形管道的使用。关于图形渲染的现有建议仍然适用。 VRS 下操作的主要区别在于,像素着色器工作负载的相对数量可能比正常渲染时小。
- 从使用多采样消除混叠( MSAA )中寻找交叉应用技术和注意事项。 VRS 的工作原理与 MSAA 类似,因此,它在延迟渲染器中的实用性有限。 VRS 无法帮助提高计算过程的性能。
不推荐
- 在翘曲占用是限制因素的情况下,避免 4 × 4 模式。
- 一般来说,像素着色工作负载与可变着色模式成线性比例。例如, 1 × 2 / 2 × 1 模式有½个 PS 调用, 2 × 2 模式有¼个 PS 调用,依此类推。
- 一个例外是 4 × 4 模式,理想情况下,该模式会有 1 / 16 像素着色器调用。但是,在 4 × 4 模式下,光栅化器无法跨越一次生成完整 32 线扭曲所需的整个像素范围。因此, 4 × 4 模式下的扭曲仅为半活动状态( 16 个线程而不是 32 个)。
- 如果翘曲占用率是一个限制因素,这意味着 4 × 4 模式可能不会比 4 × 2 / 2 × 4 模式有任何性能优势,因为翘曲的总数是相同的。
- 在使用 VRS 时,请谨慎使用,并检查其性能。
- 尽管 VRS 可能会减少正在运行的像素着色器的数量,但混合仍会以全速运行,也就是说,渲染目标中的每个单独采样都会运行一次。半透明体积效果是 VRS 的一个潜在候选效果,因为其视觉频率通常较低,但如果工作负载已经受到 ROP 限制(混合),则使用 VRS 不会改变该限制,因此可能不会导致任何明显的性能改善。
- 小心使用质心采样!在“粗像素”上选择质心样本可能会以违反直觉的方式工作!确保您熟悉 API 的规范。
- 不要修改像素着色器的输出深度值。如果像素着色器修改深度, VRS 将自动禁用。