BlueRoseNote/03-UnrealEngine/Rendering/Debug/UE5RayTracing篇-1-——NSight-Graphics.md

143 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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
个人觉得相比RenderDocNSight的优势在于
- 更加注重性能统计与优化,适合图形程序使用。
- 拥有Rtx、VR相关工具可以让你debug Rtx、VR程序。
- 2个截帧文件比较功能。
PS.2020.6.1 附加进程到UE5会直接崩溃UE4.27虽然可以启动但依然会有问题。2021.2~2022.3的Shader Profiler的Soucre功能会因为SM不是SM6而只能查看Shader的汇编指令。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_SM6.png)
只能等UE5完全支持SM6后才能使用该功能。测试版本5.02开启项目设置里的DirectX12 (SM6,Experimental)功能也不行)
### 连接到进程
NSight有3种
1. 启动进程并附加设置ApplicationExcutable后点击Launch即可。调试UE4的话还需要设置CommandLineArguments为项目路径比如D:/UnrealEngine/Project/RtxRendering/RtxRendering.uproject
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/frame_debugger_connect.01.png)
2. 手动连接已启动的进程是由通过NSight Graphics启动的进程才能连接选择启动的进程之后点Attach即可。
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/frame_debugger_attach.02.png)
3. 远程启动在远程机器上运行Nsight Remote Monitor程序之后再本机上输入远程机器的IP即可。
进入界面后点击Capture for Live Analysis即可截取帧信息默认的截取按键为F11
### NSight工具
NSight有5种工具需要在Connect to process界面中的左下角选择
- Frame Debugger基本用这个 ![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/range_profiler.01.png)
- Frame Profiler ![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/shaderprofiler_summarypage.png)
- Generate C++ Capture
- GPU Trace Profiler
- System Trace
在选择完工具连接进程之后就会显示对应的界面。部分功能需要开启设备访问权限,没开启会显示:
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_Error.png)
需要在Nvidia控制面板里进行开启步骤如下
![](https://developer.nvidia.com/sites/default/files/akamai/tools/Common/SupportSolutions/ERR_NVGPUCTRPERM_NvCtrlPanel-EnableDeveloperSettings.PNG)
![](https://developer.nvidia.com/sites/default/files/akamai/tools/Common/SupportSolutions/ERR_NVGPUCTRPERM_NvCtrlPanel-AllowAccessToPerfCtrs.PNG)
其他平台的步骤可以参考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![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/shaderprofiler_summarypage.png)
- Function Summary显示Shader函数的GPU性能占用分布。
- Hot Spots显示Shader代码的GPU性能占用分布。
- Source 可以打开特定Shader文件并且显示每行代码的GPU性能占用分布。NSight2022.3版本无法显示UE5的Shader源码![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/shaderprofiler_sourcecorrelation.png)
- All Resource可以查看渲染说用到的贴图、Buffer以及场景模型的BLAS![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_AllResource.png)![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_BLAS.png)
- Geometry该功能需要选中绘制命令才能显示对应的多边形。具体操作是Scrubber中选中Event右键选择Open Event List再从Event窗口选择绘制事件即可Filter中输入Draw就可以找到绘制事件
- PixelHistory查看一个像素绘制过程的工具。可以通过在Resource中选择绘制的RT之后使用该工具点击想要查看的像素。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_PixelHistory.png) ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_PixelHistory2.png)
- Shader Timeing HeatingRtx相关工具可以查看Rtx Shader在屏幕上的资源占用分布图。但有bug。分析UE5的某个分发Ray事件必然会崩。![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_ShaderTimingHeatmap.png)
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工程。并且显示以下界面
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/generated_capture_numbered.01.png)
该功能与RenderDoc保存截帧文件类似但NSight是截取当前帧的渲染情况并且生成一个不断渲染当前帧的程序以便后续复现与Debug。之后依次点击Build=>Execute=>Connect即可进入Frame Debugger界面。该工具还支持嵌入式Linux、桌面Linux。
#### GPU Trace
NSight的截帧功能在连接界面可以设置截帧范围截取的帧数另一个相比RenderDoc的优势就是比较2个帧文件。启动进程后点击**Generate GPU Trace Capture**就可以截取帧文件。并进入类似Frame Debugger的界面。
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/gpu_trace_launch.01.png)
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/gpu_trace_capture.01.png)
同时可以设置为高级模式,以截取更多的信息:
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/gpu_trace_options_advanced_mode_config.png)
![](https://docs.nvidia.com/nsight-tools/nsight-graphics/UserGuide/graphics/gpu_trace_capture_advanced_mode_warning.png)
#### System Trace
需要额外下载Nsight Systems工具才能使用。该工具主要分析CPU与GPU直接交互情况。
#### 其他Rt Shader相关的功能
APIInspector的Rt Shader会显示额外所需的HitTable等数据
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_APIInspector_RtxShader.png)
##### Acceleration Structure View
首先可以看一下UE中的相关文档https://docs.unrealengine.com/5.0/en-US/ray-tracing-performance-guide-in-unreal-engine/
- BLASBottom Level Acceleration Structure Updates。静态模型的BLAS会在模型载入时构建。动态物体与骨骼物体会每帧构建。
- TLASTop Level Acceleration Structure。TLAS会每帧构建。
在NSigh中可以从API Inspector或All Resource只能显示BLAS中打开并查看。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/NSight_ShowTLAS.png)
视角控制:
- WASD — 向前、向后、向左或向右移动相机
- 箭头键- 向前、向后、向左或向右移动相机
- E/Q - 向上/向下移动相机
- Shift/Ctrl - 更快/更慢地移动相机
- 鼠标滚轮——放大/缩小
- 鼠标左键 + 拖动- 向前或向后移动相机并向左或向右旋转
- 鼠标右键 + 拖动- 旋转相机
- 鼠标中间 + 拖动- 跟踪相机(向上、向下、向左、向右移动)
- 鼠标左键 + 鼠标右键 + Drag — 跟踪相机(上、下、左、右)
- ALT + 鼠标左键 + 拖动- 围绕选定几何体旋转相机
- ALT + 鼠标右键 + 拖动- 放大/缩小
- 双击或 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