「Graphics Study」RDR2渲染分析 — 总篇

Posted by Candycat on December 9, 2021

前言

从大表哥2发售以来,就一直想学习下里面的渲染技术。从体积云渲染到天气系统,从多光源的软阴影到车马的压痕轨迹,还有出色的抗锯齿,虽然别的游戏也有类似的功能,但它的实现落地就是做得更胜一筹,画面非常细腻。从截帧结果也能看出,R星花了很多功夫在那些“细枝末节”的效果处理上,这些部分在其他游戏可能就得过且过了,但也也是以性能为代价的,有些处理甚至也非常粗暴。

R星几乎很少在公共领域宣讲他们的渲染技术,印象中唯一一次就是SIGGRAPH 2019上他们分享了体积云和大气的渲染技术,大概强者就是这样孤傲?去年外网就有一篇博客分析过大表哥2的截帧分析,但博主写得有些简略,算是很好的科普级别的文章。

我这里是拿游戏性能测试时使用的渲染片段截帧分析的。不得不说大表哥2渲染一帧真的是干了太多事了,从RenderDoc看一帧的Event就有3w+。由于能力有限,我只能选几部分自己最感兴趣的尝试分析下。


我们要分析的这一帧渲染结果如下:

frame

GBuffer Layout

常规的渲染Pass中,总共输出6张1920x1080大小的RT,并且都开了8x MSAA:

GBuffer 格式 RGB通道 A通道
GBufferA R8G8B8A8_SRGB
RGB:Base Color
A:Unknown
gbuffera_rgb gbuffera_a
GBufferB R8G8B8A8_UNORM
RGB:Normal
A:特殊Shading Model的Custom Data
gbufferb_rgb gbufferb_a
GBufferC R8G8B8A8_UNORM
RGB:Unknown
A:逐材质的Shadow信息
gbufferc_rgb gbufferc_a
GBufferD R8G8B8A8_UNORM
RGB:Unknown
A:Unknown
gbufferd_rgb gbufferd_a
GBufferE R16G16_FLOAT gbuffere_rg  
Depth D32S8 depth stencil

GBuffer先摆到这里,有些用处还不太清楚,可以先参考文章最开始提到的那片博客,之后分析更多了会更新下上面的表格。

后续计划

ok,这篇文章只是开个头,因为RDR2中很多feature都干了很多事情,所以会把它们拆开到不同的文章中,内容暂定为:

那下一篇再见!