RenderDoc是一种抓帧工具,主要用来分析游戏开发中渲染流程,官网:
https://renderdoc.org/
我是用的版本是RenderDoc_1.14_64.zip
塞尔达荒野之息使用Cemu模拟器运行,图形API设置为Vulkan
使用RenderDoc直接启动程序Cemu.exe
在游戏内通过F12抓帧
抓帧后退出模拟器,就能在RenderDoc中看到当前帧,菜单Save Capture可以保存当前帧为rdc文件,我演示的抓帧文件:
https://download.csdn.net/download/tangyin025/81354657
单帧内render pipeline分析
总共24636次Vulkan调用
1~2038帧
都是一些奇怪的输出,应该是一些准备工作,其中207帧输出player、npc在草地上行走痕迹,后续用来进行草地倾斜采样
然后526~555,居然有一次近距离地形Depth输出,但不填充颜色
2043~2839帧
较远物体的Depth输出,山体、树木
2842~5109帧
这里开始输出带有颜色Color Pass,同时也包括Depth
从其他Output来看,输出的应该是延迟渲染所用的GBuffer
而且可以看出渲染时并不清理原来的buff,直接画上去
其中3436帧渲染草,可以在Mesh Viewer、VS Out看到顶点数据
同时可以在Pipeline State中看到VS(VertexShader)、FS(FragmentShader)
点击View进入Shader代码模式,可以转换成GLSL便于阅读,而且代码应该可实时修改
6101~9454帧
还是Color Pass,似乎是绘制岩壁包裹物(Terrain Cliff),也会有一些马车帐篷、广告牌
7599帧岩壁包裹物
12206~12486帧
绘制地形,比如12441帧(Mesh Viewer显示倒了)
14291 - 17312、18325 - 19026帧
应该是绘制Shadow Map,以及各个Cascade层级
19030~19053帧
好像是Screen Space Shapow Pass,以及其他信息、Depth
22476~23149帧
没看懂,好像是天空盒以及bloom输出?
23949~24579帧
应该是ui输出
24603~24623帧
模拟器调试信息
总结
- 不清楚原平台WiiU使用的图形api,估计应该是OpenGL
- 使用Deferred Rendering,并且不清理RenderTarget Color,初期渲染大片近距离地形,应该是用来清理zbuffer
- 大量vkCmdDrawIndexed调用,期间没有SetTexture、SetParameter等操作(可能被模拟器优化了?),所以虽然Draw Call达到4006,但实际开销很小
- 贴图被打包成一个大资源Multi Slice,所以不需要频繁SetTexture(可能是模拟器优化,也可能引擎优化)