renderdoc的使用
一、准备工作
1.1 下载安装
去官网下载 RenderDoc 官网
安装后依次打开Tools→Settings→Android 配置 Android SDk 和 Java JDK
1.2 真机debuggable 设置
- 准备一台高通GPU的ROOT手机
- git上 clone mprop
- 使用以下adb命令设置debuggable
adb push mprop-master/armeabi-v7a/mprop /data/local/tmp
adb shell su
chmod 755 /data/local/tmp/mprop
data/local/tmp/mprop debuggable 1
stop
start
最后再重启一下手机
我们进入adb shell然后输入su获取root权限
输入 getprop ro.debuggable 如果返回1 则设置成功了,如下图
1.2.1 真机截帧
1、这里推荐使用1.13版本,因为高版本大概率会出现renderdoc截帧提示Unsupported function used:glEGLImageTargetTexture2does,无法成功截帧,官方论坛中暂不考虑维护该扩展,使用1.13版本可以跳过该报错。
2、电脑USB连接手机后,renderdoc左下角处连接手机至Remote server ready;
3、获取当前进程名:adb shell dumpsys window | findstr mCurrentFocus
然后按照下图去选择要启动的游戏 ,这里拿和平精英举例;
手机端正常拉起renderdoc界面
点击launch后启动游戏
鼠标右键save保存文件即可
1.3 模拟器截帧
1.3.1准备环境
模拟器推荐使用MUMU模拟器,安装后,需要使用到MuMuPlayer.exe的安装路径,另外模拟器渲染模式需要选择vulkan,DX模式无法launch;
1.3.2 设置启动路径
1)Launch Application窗口点击Executable Path,选中本地mumuplayer.exe绝对路径即可
2)建议勾选Capture Child Processes
3)点击launch,启动mumu,模拟器屏幕有PrtScrn to capture即可;
4)如果launch启动不了模拟器,可以在任务管理器中杀掉mumu相关进程后重新launch;
5)启动模拟器后,手动启动需要截帧的APP,然后在file> Attach to Running Instance中连接MuMuVMMheadless进程即可进入到截帧界面
6)正常截帧即可
- 分析截帧
2.1 窗口简介
renderdoc中全部的窗口如左图中:下面按照常用的几个高频率的窗口介绍。
2.2 Event Browaser
1、通常Event Browaser、Texture Viewer、Mesh Viewer三个窗口配合使用,可以直观的判断整体的绘制顺序以及每个DC绘制的内容;
2、点击1处的时钟图标会在2处显示调用的消耗时间(仅参考耗时比例,实际数值误差相对较大)
3、这里可以关注各个pass内分别绘制的内容,比如下图中在绘制不透明场景的pass前,提前计算场景中某些物体的深度,会单独在一个pass中完成,
这里是计算了所有动态角色的深度信息,输出了阴影图和深度缓冲;
- 一般会区分绘制的内容区分pass,一般有:渲染前预计算使用的pass->渲染场景内容pass->后处理效果使用的pass(多个pass组合)->UI绘制的pass;
- 在一个pass绘制前,会有类似这种参数的设置,比如vulkan中,一个绘制指令vkCmdBeginRenderPass(C=Clear, DS=Clear) or load、store等参数含义如下
- C:color attachment ;D/S:Depth/Stencil attachment ;均是指在渲染流程中使用到的附件,分别是颜色附件、深度附件、模板附件;
- Clear:在渲染流程中代表清除为指定的值,通常在开始前将缓冲区的内容初始化一个固定的值,比如颜色,在开始渲染前将颜色缓冲区初始化为白色或者黑色;
- Load:指在渲染流程中保存当前的缓冲区的值,比如深度,再开始渲染时就以现在的深度值开始渲染,而不是以一个全新的状态开始;
- Store:指在渲染结束时会被存储到内存中,以便后续使用,在多遍渲染中通常会用到,比如第一遍生成深度信息保存在内存后,第二遍使用这些深度信息进一步处理,阴影贴图的生成和使用就是这样一个过程;一旦后续渲染过程需要使用相同的深度信息,存储在内存中可以避免重复计算深度值等,节省计算耗时;
- Barrier(屏障):通常用于确保在执行依赖前一阶段渲染结果的操作之前,这些结果已经被正确的写入到渲染目标中,通常在多阶段渲染中使用,使用barrier可以确保前一阶段的输出已经被正常写入到渲染目标中,避免数据不一致的问题。
- 示例:vkCmdDrawIndexed(1752, 19) 中的1752表示索引数,除以3即为三角形面数,即该DC绘制的模型面数为1752/3 =584 ;2即表示该绘制调用中合批绘制了19个实例;
2.3 Texture Viewer
Texture View窗口主要是看绘制的mesh内容以及输入和输出的纹理情况
2.3.1 texture view设置栏
- 通道选择:通常选择RGBA
- R/G/B/A分别选择显示文里的红、绿、蓝、alpha 通道,默认不选中A通道,查看半透明纹理时可勾选A通道
3、Actions
保存图像 (Save Image): 将当前显示的纹理保存为图像文件
open texture list:查看所有纹理情况
- resource inspector
1)Related Resources
- 列出与当前选中的资源有关联的其他资源,type主要包括Parent 、Derived,比如当前选择的是一个texture,跟该资源相关的可能包括该texture的图像、试图、采样器等;Resource则可以快速跳转到相关的资源中
2)usege in frame
- 展示选中的资源在整个帧中的使用情况,通常可以用来查看资源的重用情况、使用方式以及生命周期;
3)Resource Initialization Parameters
- 主要是看对当前的资源的创建和使用情况,包含调用的API函数以及纹理资源使用时的格式、尺寸、类型等信息;
- 通常用于排查渲染问题,可以回溯到资源创建阶段寻找潜在的问题;或者用于比较细节的格式检查或者兼容性检查,比如不兼容的采样器导致的渲染异常。
2.3.2 显示窗口
2 为显示窗口,可以自由缩放选中的资源,在下方通常会显示该资源类型或作用、尺寸、mipsmap级数、格式,如下图所示,该纹理为一张用于模拟日光的HDR的纹理,64x64[6],[6]表示它是一个6面立方体纹理(cube map),通常用于环境光照;7mips:表明有7个mipmap级别;
数据格式:R16G16B16A16_FLOAT,表示纹理的格式为16位浮点数,R\G\B\A每个通道都是16位浮点数。位数越高,精确度越高,资源占用也越高,可以根据实际场景的使用判断是否需要高精度的纹理格式。
一些常用格式以及使用场景:
- R8G8B8A8_UNORM:每个颜色通道(红、绿、蓝、透明度)占用8位,总共32位。数据是归一化的无符号整数,范围为[0, 1],最常见的纹理格式,适用于大多数2D图像和3D模型的纹理贴图;
- R8G8B8A8_UNORM_SRGB:也是较为常用的格式,适用于需要精确颜色表示的场景,尤其是在跨平台或跨设备的应用中,sRGB格式确保了图像在不同显示器上的颜色一致性;
- R16G16B16A16_UNORM:适用于需要更高精度的光照计算,有时用于深度缓冲区(Depth Buffer),尤其是在需要高精度深度值的场景中,如阴影映射(Shadow Mapping)或后期处理效果;
- R16G16B16A16_SNORM:适用于存储法线向量或者位移贴图(Displacement Maps),snorm格式可以更好地表示负值;
- BC1/BC2/BC3 (Block Compression 1/2/3):压缩纹理格式,旨在减少纹理的内存占用,BC1支持无Alpha通道的压缩,BC2支持1位Alpha通道,BC3支持4位Alpha通道;
- ETC/ETC2/ASTC等均为压缩格式。
2.3.3 input 和 output窗口
主要是对应Event Browaser中选中的Drawcall的输入和输出的纹理,双击则在显示窗口中展示,右键会有相关选项,包括resource inspector 和Used:表示该资源在整个渲染帧中使用的情况;
2.4 Mesh viewer
2.4.1 导出模型
点击1 图标,保存选中的mesh的顶点信息(csv格式),可以通过CSVConverter转换成.obj或者.fbx
如下
在unity中可以直接添加mesh 显示 使用此方式无法查看该mesh使用的骨骼数
2.4.2 VS input /VS output 窗口
- VS Input是指在顶点着色器执行之前输入的原始顶点数据,未经过任何的变换;
顶点信息通常包括:
- 顶点位置(Positon):模型的顶点空间坐标,通常是3D向量(X、Y、Z);
- 法线向量(Normal):每个顶点的法线向量,用于计算光照效果,通常是3D向量(X、Y、Z);
- UV坐标:每个顶点对应的纹理坐标,通常为2D向量(u, v),用于将纹理映射到模型表面上;一个模型可以有多个UV集,例如UV0、UV1等,根据不同的映射需求应用;比如光照贴图的使用,模型本身的贴图使用一套UV集,为了将光照贴图正确应用到模型上,需要使用第二套UV专门用于光照贴图的映射;环境光遮蔽、细节纹理等均会用到第二套UV集;
- 切线 (Tangent):可能会有多个切线坐标信息,包括副切线,切线向量与法线垂直,通常用于法线贴图和其他基于切线空间的光照技术,比如凹凸贴图,环境光遮蔽等均使用到了切线;
- VS output是指经过顶点着色器处理后的顶点数据,通常是模型从局部空间变换到了裁剪空间的结果,除了以上几种在input中的顶点信息外,还包括:
- 裁剪空间坐标:顶点着色器的关键输出属性之一,表示顶点的裁剪空间位置;是一个4D向量(x、y、z、w),w用于透视除法;
- 世界空间坐标:根据应用会输出该坐标,通常会在后期处理和阴影计算的时候使用;
- 视图空间坐标:相对于摄像机的位置坐标,通常用于计算光照效果;
2.4.3 preview窗口
VS In查看输入的模型
VS out 查看经过顶点着色器计算后在裁剪空间的模型
2.5 Pipline State窗口
该窗口是renderdoc中使用频率最高的窗口之一,展示了当前的渲染管线状态各个阶段的内容,包括了顶点输入阶段(Vertex input VTX)、顶点着色器(Vertex Shader, VS)、几何着色器(Geometry Shader, GS)、光栅化(Rasterizer, RS)、像素着色器(Fragment Shader, FS)以及帧缓存(Frame Buffer,FB)等各个阶段的状态和配置。
2.5.1 顶点输入阶段(Vertex input VTX)
主要定义了顶点缓冲区中的数据如何映射到顶点着色器的输入,主要包含index、Enabled、属性名、Format(指定了数据的类型)、buffer slot、Relative Offset;
Buffer Slot是指该顶点缓冲区在渲染管线中绑定的位置,缓冲区通过不同的槽位进行区分;Relative Offset ,具体是指当前顶点缓冲区起始位置的偏移量,通常在实例化绘制时会用到,通过使用同一组顶点数据根据不同的实例的需求进行偏移,从而实现实例化绘制操作;
Vertex array Object(VAO)窗口主要是展示绑定到VAO上各个顶点缓冲区的详细信息
1)Slot: 缓冲区绑定的槽位索引
2)Buffer: 缓冲区对象的ID
3)Stride: 缓冲区的步长,即相邻顶点之间的字节数
4)Offset: 从缓冲区起始位置的偏移量(以字节为单位)
5)Divisor: 实例化渲染时的实例分割器,用于跳过顶点
6)Byte Length: 缓冲区的长度(以字节为单位)
2.5.2 顶点着色器 (Vertex Shader, VS)
Resources主要展示在顶点着色器中采样的纹理的尺寸和格式等信息以及Sampler的采样方式,我们主要看环绕模式(Wrap Mode)以及过滤模式(Filter Mode)以及LOD范围;
定义:Uniform Buffers(统一缓冲区)的主要作用是在一次绘制调用(Draw Call)期间为所有顶点和片段提供一组不变的数据,这些数据可以在多个着色器之间共享;这里可以理解为在顶点着色器中计算的内容绑定使用到的Uniform buffers的一些信息;
2.5.3 TCS(Tessellation Control Shader):用于控制细分网格的生成、TES(Tessellation Evaluation Shader):用于评估细分网格的顶点、GS(Geometry Shader):用于生成新的几何体
4、光栅化 (Rasterizer, RS)
RS 阶段将图元转换为片段(fragments),即潜在的像素。在这个阶段,主要关注以下内容:
- Cull Mode:决定了哪些面会被剔除,例如前向面、后向面或者都不剔除。
- Clip Setup: 表示剪裁区域的设置。
- Fill Mode:决定了多边形内部是如何填充的,如实心、线框等。
- Depth Bias:用于防止深度冲突,特别是在渲染阴影贴图时非常有用。
- Multisamp state窗口:设置了多重采样的参数,这对于抗锯齿至关重要。
2.5.4 片段/像素着色器(Fragment/pixel Shader)
FS/PS 阶段负责计算每个像素的颜色,是渲染管线中最关键的部分之一,在这个阶段,重点关注查看:
- Textures 和 Samplers:展示了所有绑定到像素着色器的纹理及其对应的采样器设置;
- Shader Code:同样可以通过点击“View”按钮来查看具体的着色器代码,或者save保存下来;
- 评估一个Shader性能的时候我们最常用的指标是Instruction Cycles,一般主要关注的是Total Instruction Cycles和registers 的使用情况,以下Total instruction cycles中的各个元素即为主要影响cycles总量的元素;
- shader性能评估:通过save下ps中的shader代码,通过ARM Mobile Studio - Mali Offline Compiler工具
量化shader的复杂度情况,命令行工具使用如下:
ARM Mobile Studio - Mali Offline Compiler - 官方视频教学 - 笔录-CSDN博客
这里需要理解cycle的定义,
2.5.5 帧缓存(Frame buffer FB)
存储最终渲染结果的缓冲区,对应Texture view 中的output的内容,通常包含颜色缓冲区、深度缓冲区和模版缓冲区、Target Blends等信息
Target Blends 是图形渲染管线中用于控制颜色缓冲区(即渲染目标)如何与现有内容混合的设置,比如在带透明度的物体渲染时,通常就会启用混合,通常会设置为True,col src 设置为Src Alpha,除了透明物体渲染时会开启blend,在一些复杂的后处理也会用到,比如景深、运动模糊等效果;
开启状态
关闭状态
2.6 statistics viewer
对截帧的整体内容的统计,主要关注Summary的中的Draw calls、API calls,以及Textures 数量和内存、使用的RT数量和内存;
RT概念补充:允许将场景或特定对象的渲染结果存储在一个纹理中缓存,而不是直接显示在屏幕上,像是一些常用的屏幕后处理都会用到RT,比如抗锯齿、景深、模糊、HDR等需要将整个屏幕的内容渲染一个RT中,然后在该RT的基础进行各种计算处理;shadaw map也用到了RT缓存动态光源产生的阴影贴图;另外一些深度或者模版的预处理内容或者为了节省实时渲染消耗提前将不频繁变化的部分渲染到RT中,渲染时直接渲染RT即可;