US5L8——帧调试器
US5L8——帧调试器
帧调试器
我们可以利用 Unity 自带的帧调试工具,看到游戏图像的某一帧是如何一步步渲染出来的
我们可以在 Window(窗口) ——> Analysis(分析) ——> Frame Debugger(帧调试) 中打开帧调试工具
帧调试器是一个非常强大的工具,特别是在渲染调试、优化和效果分析方面有着重要的意义,它可以帮助我们:
- 精准调试渲染问题,可以逐步查看渲染调用
- 有助于优化性能,通过分析渲染调用,找出性能瓶颈并优化
- 有助于调试材质、纹理和着色器,可以查看渲染时使用的材质、纹理和参数、快速定位问题
- 可视化渲染过程,可以通过查看渲染目标和中间结果,深入了解渲染过程
等等
帧调试器的使用
要使用帧调试器,我们必须要认识该窗口上各部分有什么作用,帧调试器可以分为三个部分
-
第一部分:工具栏
-
Enable/Disable:该按钮控制调试窗口释放处于启用状态,启用后我们就可以查看渲染过程
不过要注意,此工具只能看特定一帧的渲染过程,也就是说如果在程序运行时激活该工具,将自动暂停程序的运行
-
Editor:Editor 可以帮助我们利用帧选择器帮助我们远程调试构建到真机下的 Unity 程序,需要输入此帧的 IP 地址
但是在发布项目时,必须要勾选 Development Build(开发模式构建)和 Run In Background(在后台运行)
-
拖动条和左右按钮可以帮助我们逐步查看该帧的渲染步骤
其中,中间数字代表目前是当前帧的第几个渲染步骤,结合 Game 窗口或者渲染事件详细信息的 Output / Mesh 确认每一步渲染了哪些内容
-
-
第二部分:渲染事件列表
这是帧调试工具的核心部分,它列出了当前渲染帧中所有的渲染调用(Draw Call)以及类似清空帧缓存等操作,
每一个条目都表示一个渲染步骤,我们可以在这里选择任意渲染步骤查看相关信息,
在此树状列表中,每一个叶子节点都是一个事件,每一个父节点右侧显示的都是该节点下事件数目,例如:-
Camera.Render:渲染过程
-
UpdateDepthTexture:更新深度纹理
- Clear:清除屏幕缓冲区渲染的内容
- DepthPass.Job:深度通道渲染
-
Drawing:绘图
-
Render.OpaqueGeometry:不透明几何体
-
Render Shader Map:渲染阴影贴图
- Shadows.RenderJob:阴影渲染
-
Collect Shadows:收集阴影
-
RenderLoopJob:渲染循环
-
-
-
-
Camera.ImageEffects:图像效果(屏幕后处理效果)
-
等等
我们可以从事件的名字了解这些步骤(事件)主要是在做什么内容
-
-
第三部分:渲染事件详细信息
这里可以看到某个渲染事件的各种数据和信息
-
顶部工具栏
可以让我们为 Game 窗口的当前状态隔离 RGBA 的颜色通道,并且可以通过右侧的 Levels 等级滑动条,根据亮度级别来隔离视图区域
-
RT0 / Depth:选择渲染目标选项
其中的 RT 代表的是 Render Target(渲染目标),代表当前帧的第几个渲染目标,
RT0 一般指的就是颜色缓冲区,也就是渲染场景得到的最终图像,
在一些复杂的渲染管道上(例如延迟渲染、后处理、阴影渲染等),可能存在多个渲染目标
我们看到的 RT0 通常指代的就是第一个渲染输出图像Depth 就是深度,可以查看本步骤的深度信息,一般只在深度渲染步骤内才能查看到内容
-
Channels:颜色通道
ALL、R、G、B、A 用于选择查看渲染目标中的具体通道数据,
如果只选择其中一个,某个通道的值也会被单独提取出来,显示为灰度图像,我们可以只管感受到该颜色通道的变化主要作用:在某些渲染过程中,如果某一颜色通道的数据感兴趣(比如调试纹理、材质或透明度问题),就可以选择查看单一的颜色通道
-
Levels:调整渲染目标的色彩范围显示
RGBA 的范围往往是 0~1,Levels 允许我们调整这个范围的映射,
因为有时渲染结果的颜色分量可能表示的是深度、法线或其他非标准颜色信息,
只可能非常接近 0 或者 1,我们可以调整 Levels 将细节拉升出来,更容易看出数据的变化。例如选择一个深度通道渲染步骤,由于深度值全部导致非常接近 0 ,
这导致显示输出到屏幕上深度图几乎是黑的,难以观察,这时将右侧的范围调小即可看到内容不调整 Levels 时,几乎无法看到内容:
将最大值拉小,即可看到在 Output 处看到内容:
-
-
Output / Mesh:屏幕输出信息和网格信息
-
Output:显示当前 渲染调用 的输出信息,包括渲染的目标图像、纹理或者缓冲区
红框是本次 渲染调用 渲染的物体
-
Mesh:显示当前 渲染调用 所用的网格消息(即 3D 模型的顶点数据)
如果这个 渲染调用 渲染了一个物体的网格消息,可以在这个选项中看到该网格的具体数据
-
-
Details:详细信息
显示当前 渲染调用 的详细信息,比如渲染状态、材质、着色器、渲染目标等。
这些信息可以帮助深入了解渲染的具体参数,却表每个渲染步骤都按照预期执行。
在该页签可以看到诸如:剔除模式、使用的 Shader、Pass、混合模式、深度测试是否开启、光照模式等等信息,
我们可以通过这些信息排查渲染问题。各个属性的简略消息如下:
属性标签 作用 属性标签 作用 RenderTarget 渲染目标的名称 Size 渲染目标的尺寸 ZClip 是否开启深度裁剪 Format 渲染目标的贴图格式 ZTest 深度测试模式 Color Actions 颜色行为 ZWrite 是否开启深度写入 Depth Actions 深度行为 Cull 剔除模式 Memoryless 是否是无记忆性模式 Conservative 是否使用保守光栅化 Foveated Rendering 是否激活注视点渲染 Offset 深度偏移 ColorMask 颜色蒙版 Stencil 模板 Blend Color 颜色 混合方式 Stencil Ref 模板引用值 Blend Alpha 透明度 混合方式 Stencil ReadMesk 模板测试的模板 ReadMesk 值 BlendOp Color 颜色 混合操作 方式 Stencil WriteMask 写入模板缓冲区的模板写入掩码值 BlendOp Alpha 透明度 混合操作 方式 Stencil Comp GPU对所有像素执行的模板测试操作 Stencil Pass GPU对通过模板与深度测试的像素在模板缓冲区执行的操作 DrawInstanced Calls GPU实例化的渲染调用数 Stencil Fail GPU对未通过模板测试的像素在模板缓冲区执行的操作 Instances 单个GPU实例化渲染的实例数 Stencil ZFail 对通过模板但未通过深度测试像素在模板缓冲区执行的操作 Draw Calls 本次渲染事件的渲染调用数 Vertices 本次渲染事件期间处理的顶点数 Indices 本次渲染事件期间处理的索引数 Batch cause 本次绘制批处理开始的原因 Light Mode LightMode 标签值(Pass 的执行阶段) Pass 本次渲染事件的渲染通道名 User Shader 本次渲染事件使用的 Pass 实际所属的 Shader Origin 本次渲染事件使用的 Shader -
Keywords:关键词
显示当前 渲染调用 中所用的着色器关键词,这些关键词控制着色器中的条件编译,决定了哪些着色器代码会被调用
-
Textures:纹理数据
显示当前 渲染调用中使用的 纹理数据,你可以看到与当前渲染相关的所有纹理(包括漫反射纹理、法线纹理、镜面反射纹理等等)
-
Ints:整数数据
显示当前 渲染调用 中传递到着色器中的整数数据,这些数据通常是作为着色器常量(比如材质的参数、场景配置等)传入的
其中,Stage 指的是 Unity 使用此整数信息时所处的着色器阶段。可能的值为:
- vs:顶点着色器(Vertex Shader)
- fs:片元着色器(Fragment Shader)
- gs:几何着色器(Geometry Shader)
- hs:细分控制着色器(Hull Shader,属于曲面细分着色器的一部分)
- ds:细分计算着色器(Domain Shader,属于曲面细分着色器的一部分)
-
Floats:浮点数数据
显示当前渲染调用中传递到着色器中的浮点数数据,浮点数通常用于诸如颜色值、材质属性、光照强度等浮动数据
其中,Stage 指的是 Unity 使用此浮点数信息时所处的着色器阶段。可能的值为:
- vs:顶点着色器(Vertex Shader)
- fs:片元着色器(Fragment Shader)
- gs:几何着色器(Geometry Shader)
- hs:细分控制着色器(Hull Shader,属于曲面细分着色器的一部分)
- ds:细分计算着色器(Domain Shader,属于曲面细分着色器的一部分)
-
Vectors:向量数据
显示当前 渲染调用 中传递到着色器中的向量数据,向量通常用于存储坐标、法线、颜色(如 RGB 颜色)或其他方向性数据
其中,Stage 指的是 Unity 使用此向量信息时所处的着色器阶段。可能的值为:
- vs:顶点着色器(Vertex Shader)
- fs:片元着色器(Fragment Shader)
- gs:几何着色器(Geometry Shader)
- hs:细分控制着色器(Hull Shader,属于曲面细分着色器的一部分)
- ds:细分计算着色器(Domain Shader,属于曲面细分着色器的一部分)
-
Matrices:矩阵数据
显示当前 渲染调用 中传递到着色器中的矩阵数据。矩阵在 3D 渲染中通常用于变换(例如模型矩阵、视图矩阵、投影矩阵),或者用于表示变换数据
其中,Stage 指的是 Unity 使用此矩阵信息时所处的着色器阶段。可能的值为:
- vs:顶点着色器(Vertex Shader)
- fs:片元着色器(Fragment Shader)
- gs:几何着色器(Geometry Shader)
- hs:细分控制着色器(Hull Shader,属于曲面细分着色器的一部分)
- ds:细分计算着色器(Domain Shader,属于曲面细分着色器的一部分)
-
Buffers:缓冲区数据
显示当前 渲染调用 使用的缓冲区数据,缓冲区可以是顶点缓冲区(用于存储模型的顶点数据)、索引缓冲区(用于存储模型的索引数据)等
-
Constant Buffers:常量缓冲区数据
显示当前 渲染调用 中传递到着色器中的常量缓冲区(Constant Buffers)数据。常量缓冲区通常用于传递一些不常变化的值(如视图矩阵,世界矩阵,光照参数等)
-