截帧分析 - 燕云十六声
截取场景
- 使用RenderDoc对MuMu模拟器下运行的燕云进行截帧。(Vulkan模式)
GPU粒子输出
- 最开始输出了四张RT,在后面绘制粒子的时候会用到,应该是保存了GPU粒子系统输出的结果,在绘制粒子的时候控制粒子的状态。(256x256)
绘制阴影图
- RT0绘制了角色的阴影,RT1暂时没有截取到绘制的情况。
- 每帧都会更新。
- RT2和RT3是第一层级联阴影,一张用来绘制阴影,一张用来采样阴影,每帧只绘制一部分对象,大概分16帧绘制完一张完整的阴影图。
- 目前发现跑动的时候和光照方向发生变化的时候会触发更新。
- RT4和RT5是第二层级联阴影,绘制策略和第一层相似,但绘制的周期更长。
- 目前发现只有光照方向发生变化的时候才会触发更新。
- 在所有画质下,阴影图尺寸均为1024x1024x6。
填充GBuffer
- 一共使用了5张RT,渲染顺序:远景->角色->地形->物件->树干->花->头发->衣物->公告板草->插片草->公告板树->树叶->实体粒子(蝴蝶)-> 地表贴花。(省电:1200x675 | 平衡:1280x720 | 质量和极致:1300x731)
GBuffer0(R11G11B10):绘制了角色和落叶的光照。
GBuffer1(R8G8B8A8):RGB记录了基色,A像是AO。
GBuffer2(R8G8B8A8):R?G?B?A为草的模拟阴影。
GBuffer3(R8G8B8A8):RGB为法线,A?
GBuffer4(R32):深度图
采样阴影图
- 把阴影绘制到GBuffer2的A通道上(草还没有阴影)
绘制光照
- 依次绘制物件->模型植被->公告板植被的光照
绘制天空
![]() |
![]() 八面体压缩
|
绘制深度图、ShadowAO及深度雾RT
- 绘制带有mipmap的深度图(1024x512 R16)(省电没有这一步 | 平衡:3级mips | 质量和极致:10级mips)
- 由带有mipmap的深度图、法线图、阴影图生成,生成了存储ShadowAO及深度雾信息的RT(省电没有这一步)
降低分辨率及绘制粒子
- 降低分辨率,进行后续粒子特效的绘制(省电:1200x675 -> 600x337 | 平衡:1280x720 -> 640x360 | 质量和极致:1300x731 -> 650x365)
- 像是绘制与地形有关的RT?(省电没有这一步)
- 绘制特效粒子,这个阶段用到了一开始生成的四张RT
绘制半透对象
- 使用ShadowAO及深度雾RT进行了全屏的后处理,渲染出了草的假影
- 使用与地形有关的RT,看着像是对地形进行了什么处理
- 使用绘制特效粒子的RT,将粒子特效绘制到GBuffer0上
- 绘制蜻蜓、睫毛、眉毛、头发等半透对象,绘制蜻蜓的时候也用到了一开始生成的四张RT,应该是用于控制蜻蜓的移动
Bloom与ToneMapping
- 省电:没有降低分辨率和模糊的过程,直接由GBuffer0经由lut矫正生成
- 平衡:1280x720 -> 320x180 -> 模糊 -> 80x45 -> 模糊 -> 亮度提取 -> 将各个分辨率的结果从小到大叠加混合,最后再用lut进行矫正
- 质量和极致:1300x731 -> 325x182 -> 模糊x3 -> 81x45 -> 模糊x3 -> 20x11 -> 模糊x3 -> 5x4 -> 模糊 -> 亮度提取 -> 将各个分辨率的结果从小到大叠加混合,最后再用lut进行矫正ToneMapping前ToneMapping LUTToneMapping后
SMAA
- 对角色周围的像素进行SMAA处理SMAA Step1SMAA Step2SMAA LUTSMAA Result
绘制UI
![]() |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 鹏の箱庭!