[gdc20]魔兽世界中的VRS应用

[gdc20]魔兽世界中的VRS应用
gdc2020, blizzard带来在魔兽世界中的vrs的应用。
顺便也把intel的专门支持VRS的一篇GDC talk也带上了。

VariableRateShading

VRS是VariableRateShading的简写,最初是用于VR设备。
后来在vulkan,dx12中成为标配,陆续在各种GPU里也有支持,也是dx12相比dx11重要的技术优势。
可以提供在不同的区域以不同的比例来做shading(也就是一个像素的shading用于多个像素);比如这样:
[gdc20]魔兽世界中的VRS应用
这样在一些图像变化低频区域或者视觉不敏感的区域(比如VR中的视觉边缘的地方),就可以用1x2甚至2x2的VRS,进而优化性能。

VRS的优势

这里可能有的同学会觉得和低分辨率渲染particle比较像,这里就涉及到VRS的优势:

  • 可控性高
  • 边缘处理比较好

可控性

VRS主要有几个控制方式,可以在屏幕上非常精准的启用:

  • DrawCall:可以只针对一个drawcall启用
  • 屏幕mask:可以在屏幕上生成一个mask(比如mask出天空,然后对天空使用)
  • primitive attribute:可以在vertex/geometry shader里输出attribute来控制启用

所以可见这个可控性是非常好的

边缘处理

VRS的时候是fragment shading是可以减少变成1x2,2x2这种,但是depth buffer还是一个1:1的状态;
加上shading策略是这样的:
[gdc20]魔兽世界中的VRS应用
也就是在边缘上有很好的的处理。
常规我们在处理低分辨率渲染的,upscale的时候都要各种bilateral filter处理(还不干净),这个相比之下就干净多了

具体挑战

毕竟这个是一个降低分辨率的活,那么具体用在哪里是一个摸索尝试的过程。
msdn的建议里包括:

  • ui覆盖的场景
  • motion blur,dof等
  • 天空等

手机其实也有支持

这个现在比较新的mobile gpu上也逐渐有支持,手游开发者可以和具体gpu厂商联系询问。

魔兽世界里的应用

[gdc20]魔兽世界中的VRS应用
暴雪表示红色部分都是可以尝试的,不过考虑到魔兽毕竟贴图精度,画面风格各方面。。。
简言之大家还是在自己游戏里各种都尝试,最后暴雪的结论是:

  • 在地形,dof,motionblur,远景物件上用都挺好的
  • 而且这个vrs的切换也非常的不容易看出来,很平滑
  • 相比低分辨渲染,边缘处理的更好
  • 特效会有blocky的感觉(这里根据vrs的原理也比较好推测,毕竟是少了linear filter这种)

reference

https://www.gdcvault.com/play/1026683/For-the-Alliance-World-of
https://www.gdcvault.com/play/1026691/Variable-Rate-Shading-Tier-1
https://docs.microsoft.com/en-us/windows/win32/direct3d12/vrs