[gdc20]魔兽世界中的VRS应用
gdc2020, blizzard带来在魔兽世界中的vrs的应用。
顺便也把intel的专门支持VRS的一篇GDC talk也带上了。
VariableRateShading
VRS是VariableRateShading的简写,最初是用于VR设备。
后来在vulkan,dx12中成为标配,陆续在各种GPU里也有支持,也是dx12相比dx11重要的技术优势。
可以提供在不同的区域以不同的比例来做shading(也就是一个像素的shading用于多个像素);比如这样:
这样在一些图像变化低频区域或者视觉不敏感的区域(比如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策略是这样的:
也就是在边缘上有很好的的处理。
常规我们在处理低分辨率渲染的,upscale的时候都要各种bilateral filter处理(还不干净),这个相比之下就干净多了
具体挑战
毕竟这个是一个降低分辨率的活,那么具体用在哪里是一个摸索尝试的过程。
msdn的建议里包括:
- ui覆盖的场景
- motion blur,dof等
- 天空等
手机其实也有支持
这个现在比较新的mobile gpu上也逐渐有支持,手游开发者可以和具体gpu厂商联系询问。
魔兽世界里的应用
暴雪表示红色部分都是可以尝试的,不过考虑到魔兽毕竟贴图精度,画面风格各方面。。。
简言之大家还是在自己游戏里各种都尝试,最后暴雪的结论是:
- 在地形,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