可变速率着色 VRS
什么是可变速率着色
可变速率着色(VRS)是一种图形渲染优化技术,允许开发者控制屏幕不同区域的像素着色频率。传统渲染中,每个像素执行一次像素着色器(着色率1x1);VRS 可以将多个像素合并为一个着色单元,即着色率降低(如2x2表示2x2像素块只执行一次着色),从而减少计算量,提升帧率。
原理与类型
着色率定义
着色率指每个片元着色器调用覆盖的像素数。例如:
- 1x1:每个像素着色一次(默认)。
- 1x2 或 2x1:两个像素共享一次着色。
- 2x2:四个像素共享一次着色。
- 4x4 等:更低着色率。
VRS 实现层级
VRS 可通过多种方式设置着色率:
- **每绘制调用(Per-Draw)**:对整个 draw call 设置统一着色率。
- **每图元(Per-Primitive)**:在几何着色器或网格着色器中根据图元属性(如距离)设置。
- **屏幕空间图像(Screen-Space Image)**:使用一张纹理指定屏幕各区域的着色率,最灵活。
- **组合(Combiner)**:将上述来源结合,取最粗粒度。
硬件支持
VRS 是 DirectX 12 Ultimate、Vulkan 1.2 的特性,需要较新 GPU(NVIDIA Turing、AMD RDNA 2、Intel Xe 等)。
应用场景
周边区域降低着色率
人眼对视野中心细节敏感,对边缘不敏感。可使用屏幕空间图像降低屏幕边缘的着色率,不影响主观画质。
运动区域降低着色率
快速运动的物体不易被察觉细节,可对其降低着色率。
暗部或低对比度区域
在阴影或平坦颜色区域,可降低着色率而不引起注意。
结合注视点渲染(Foveated Rendering)
在 VR 中,根据眼球追踪,在用户注视点使用高着色率,周围大幅降低着色率,显著提升性能。
优点与挑战
**优点**:
- 直接减少像素着色器调用次数,降低 GPU 负载。
- 灵活可控,可针对不同区域优化。
- 与其他优化技术(如 LOD、剔除)互补。
**挑战**:
- 降低着色率可能导致锯齿、模糊或细节丢失。
- 需要合理设计着色率分配,否则画质下降明显。
- 部分硬件不支持或支持有限。
实践建议
- 从每绘制调用 VRS 开始,对远处物体或小物体降低着色率。
- 使用屏幕空间图像实现注视点渲染,在 VR 中收益最大。
- 避免在 UI、文字或重要边缘区域降低着色率。
- 结合时间抗锯齿(TAA)可抵消部分画质损失。
未来趋势
VRS 是图形 API 演进的重要方向,与网格着色器、采样器反馈等技术共同构成现代渲染优化基础。未来可能出现更细粒度的着色率控制,如基于内容的自适应 VRS,利用机器学习预测最佳着色率分布。
常见问题
VRS 能提升多少性能?
性能提升取决于着色率降低的程度和场景内容。在 VR 注视点渲染中,可提升 30% 以上;在传统游戏中,一般可提升 10%-20%,且画质损失较小。
VRS 和 DLSS/FSR 有什么区别?
VRS 是降低实际着色工作的技术,不改变分辨率;DLSS/FSR 是通过低分辨率渲染再放大,两者都能提升性能,但原理不同,可结合使用。
哪些 GPU 支持 VRS?
NVIDIA Turing(RTX 20 系列及 GTX 16 系列)及以后、AMD RDNA 2(RX 6000 系列)及以后、Intel Xe 系列等支持 VRS。
VRS 会导致画质下降吗?
如果使用得当,降低不敏感区域的着色率,主观画质影响很小。但不当使用可能导致明显的锯齿或细节丢失。
如何在游戏引擎中启用 VRS?
Unity 和 Unreal 引擎提供 VRS 支持,可通过渲染设置或插件开启。具体需参考引擎文档,并确保硬件和 API 支持。