2023-06-29 11:55:02 +08:00
---
title: UE5RayTracing篇-1-——NSight-Graphics
date: 2022-11-11 17:51:43
excerpt:
tags:
rating: ⭐
---
最近打算开始研究UE的RayTracing, 但欲先利其事必先利器, 必要的Debug手段还是需要会用。在发现RenderDoc不支持RayTracing后, 花了些时间学习了一下NSight Graphics。一般的流程就是使用NSight启动要调试的游戏( 项目) 进程, 之后按F11截帧并使用所需工具查看。下面的章节将会简单介绍一下它的功能。
<!-- more -->
## UE RayTracing与Shader开发相关
UE的RayTracing Debug界面需要输入命令后才会显示:
```
show raytracingdebug 1
r.RayTracing.DebugVisualizationMode Performance
r.RayTracing.DebugVisualizationMode Traversal Node
```
UE5.0.1这些命令无效, 5.02虽然可以显示Debug界面了, 但里面不会渲染任何东西。
为了能够截取到Shader的源码并使用RenderDoc的断点调试, 需要开启Shader开发变量。位于Engine/Config/ConsoleVariables.ini中:
```
//删除前面的//即可开启
r.ShaderDevelopmentMode=1
r.Shaders.Optimize=0
```
## NSight
介绍视频:
- https://youtu.be/yBIKsjd2dJk
- https://youtu.be/LKR5XIW1lgs
文档:
- https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/index.html
- https://docs.nvidia.com/nsight-graphics/AdvancedLearning/index.html
个人觉得相比RenderDoc, NSight的优势在于:
- 更加注重性能统计与优化,适合图形程序使用。
- 拥有Rtx、VR相关工具, 可以让你debug Rtx、VR程序。
- 2个截帧文件比较功能。
PS.2020.6.1 附加进程到UE5会直接崩溃, UE4.27虽然可以启动, 但依然会有问题。2021.2~2022.3的Shader Profiler的Soucre功能会因为SM不是SM6而只能查看Shader的汇编指令。

只能等UE5完全支持SM6后才能使用该功能。( 测试版本5.02, 开启项目设置里的DirectX12 (SM6,Experimental)功能也不行)
### 连接到进程
NSight有3种
1. 启动进程并附加: 设置ApplicationExcutable后, 点击Launch即可。调试UE4的话还需要设置CommandLineArguments为项目路径, 比如D:/UnrealEngine/Project/RtxRendering/RtxRendering.uproject

2. 手动连接已启动的进程( 是由通过NSight Graphics启动的进程才能连接) : 选择启动的进程, 之后点Attach即可。

3. 远程启动: 在远程机器上运行Nsight Remote Monitor程序, 之后再本机上输入远程机器的IP即可。
进入界面后点击Capture for Live Analysis即可截取帧信息( 默认的截取按键为F11) 。
### NSight工具
NSight有5种工具, 需要在Connect to process界面中的左下角选择:
- Frame Debugger( 基本用这个) 
- Frame Profiler 
- Generate C++ Capture
- GPU Trace Profiler
- System Trace
在选择完工具连接进程之后就会显示对应的界面。部分功能需要开启设备访问权限,没开启会显示:

需要在Nvidia控制面板里进行开启, 步骤如下:


其他平台的步骤可以参考https://developer.nvidia.com/nvidia-development-tools-solutions-err_nvgpuctrperm-permission-issue-performance-counters
#### Frame Debugger与Frame Profiler
Frame Debugger工具包含了Frame Profiler, 这些工具里Shader Profiler工具最为重要。
- Shader Profiler
- Summary
- Function Summary显示Shader函数的GPU性能占用分布。
- Hot Spots显示Shader代码的GPU性能占用分布。
- Source 可以打开特定Shader文件, 并且显示每行代码的GPU性能占用分布。( NSight2022.3版本无法显示UE5的Shader源码) 
- All Resource: 可以查看渲染说用到的贴图、Buffer以及场景模型的BLAS
- Geometry: 该功能需要选中绘制命令才能显示对应的多边形。具体操作是: Scrubber中选中Event, 右键选择Open Event List, 再从Event窗口选择绘制事件即可( Filter中输入Draw就可以找到绘制事件)
- PixelHistory: 查看一个像素绘制过程的工具。可以通过在Resource中选择绘制的RT之后使用该工具点击想要查看的像素。  
- Shader Timeing Heating: Rtx相关工具, 可以查看Rtx Shader在屏幕上的资源占用分布图。但有bug。分析UE5的某个分发Ray事件必然会崩。
PS.Ctrl+滚轮放大与缩小Event时间轴; 在左上角Frame Debugger里可以打开其他工具, 所有的UI介绍可以参考https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/index.html#frame_debugging_profiling_ui
#### Generate C++ Capture
进入工具,点击**Generate C++ Capture**后会捕获并且生成一个VS工程。并且显示以下界面:

该功能与RenderDoc保存截帧文件类似, 但NSight是截取当前帧的渲染情况并且生成一个不断渲染当前帧的程序以便后续复现与Debug。之后依次点击Build=>Execute=>Connect即可进入Frame Debugger界面。该工具还支持嵌入式Linux、桌面Linux。
#### GPU Trace
NSight的截帧功能, 在连接界面可以设置截帧范围( 截取的帧数) , 另一个相比RenderDoc的优势就是比较2个帧文件。启动进程后, 点击**Generate GPU Trace Capture**就可以截取帧文件。并进入类似Frame Debugger的界面。


同时可以设置为高级模式,以截取更多的信息:


#### System Trace
需要额外下载Nsight Systems工具才能使用。该工具主要分析CPU与GPU直接交互情况。
#### 其他Rt Shader相关的功能
APIInspector的Rt Shader会显示额外所需的HitTable等数据:

##### Acceleration Structure View
首先可以看一下UE中的相关文档: https://docs.unrealengine.com/5.0/en-US/ray-tracing-performance-guide-in-unreal-engine/
- BLAS: Bottom Level Acceleration Structure Updates。静态模型的BLAS会在模型载入时构建。动态物体与骨骼物体会每帧构建。
- TLAS: Top Level Acceleration Structure。TLAS会每帧构建。
在NSigh中可以从API Inspector或All Resource( 只能显示BLAS) 中打开并查看。

视角控制:
- WASD — 向前、向后、向左或向右移动相机
- 箭头键- 向前、向后、向左或向右移动相机
- E/Q - 向上/向下移动相机
- Shift/Ctrl - 更快/更慢地移动相机
- 鼠标滚轮——放大/缩小
- 鼠标左键 + 拖动- 向前或向后移动相机并向左或向右旋转
- 鼠标右键 + 拖动- 旋转相机
- 鼠标中间 + 拖动- 跟踪相机(向上、向下、向左、向右移动)
- 鼠标左键 + 鼠标右键 + Drag — 跟踪相机(上、下、左、右)
- ALT + 鼠标左键 + 拖动- 围绕选定几何体旋转相机
- ALT + 鼠标右键 + 拖动- 放大/缩小
2023-09-11 16:54:11 +08:00
- 双击或 F - 将相机聚焦在选定的几何体上
# UE查看Shader代码
想要看源代码需要开启:
r.Shaders.Optimize=0
; When this is enabled, shaders will have extra debugging info. This could change patch sizes, uniqueness, etc and will recompile the shaders
r.Shaders.Symbols=1
; When this is enabled, ShaderName field of FRHIShader will be populated (Development and Debug builds only)
r.Shaders.ExtraData=1