This commit is contained in:
2025-08-02 12:09:34 +08:00
commit e70b01cdca
2785 changed files with 575579 additions and 0 deletions

View File

@@ -0,0 +1,154 @@
---
title: RDG Debug笔记
date: 2025-06-14 15:44:47
excerpt:
tags:
rating: ⭐
---
# 前言
- [UE5 Render Dependency Graph-实用指南](https://zhuanlan.zhihu.com/p/637889120)
# Command
- r.rdg
- AsyncCompute
- BreakPoint
## Reference
```c++
FAutoConsoleVariableRef CVarRDGDebug(
TEXT("r.RDG.Debug"),
GRDGDebug,
TEXT("Allow to output warnings for inefficiencies found during wiring and execution of the passes.\n")
TEXT(" 0: disabled;\n")
TEXT(" 1: emit warning once (default);\n")
TEXT(" 2: emit warning everytime issue is detected."),
ECVF_RenderThreadSafe);
FAutoConsoleVariableRef CVarRDGClobberResources(
TEXT("r.RDG.ClobberResources"),
GRDGClobberResources,
TEXT("Clears all render targets and texture / buffer UAVs with the requested clear color at allocation time. Useful for debugging.\n")
TEXT(" 0:off (default);\n")
TEXT(" 1: 1000 on RGBA channels;\n")
TEXT(" 2: NaN on RGBA channels;\n")
TEXT(" 3: +INFINITY on RGBA channels.\n"),
ECVF_Cheat | ECVF_RenderThreadSafe);
FAutoConsoleVariableRef CVarRDGOverlapUAVs(
TEXT("r.RDG.OverlapUAVs"), GRDGOverlapUAVs,
TEXT("RDG will overlap UAV work when requested; if disabled, UAV barriers are always inserted."),
ECVF_RenderThreadSafe);
FAutoConsoleVariableRef CVarRDGTransitionLog(
TEXT("r.RDG.TransitionLog"), GRDGTransitionLog,
TEXT("Logs resource transitions to the console.\n")
TEXT(" 0: disabled(default);\n")
TEXT(">0: enabled for N frames;\n")
TEXT("<0: enabled;\n"),
ECVF_RenderThreadSafe);
TAutoConsoleVariable<FString> CVarRDGDebugPassFilter(
TEXT("r.RDG.Debug.PassFilter"), TEXT(""),
TEXT("Filters certain debug events to specific passes. Set to 'None' to reset.\n"),
ECVF_Default);
TAutoConsoleVariable<FString> CVarRDGDebugResourceFilter(
TEXT("r.RDG.Debug.ResourceFilter"), TEXT(""),
TEXT("Filters certain debug events to a specific resource. Set to 'None' to reset.\n"),
ECVF_Default);
FAutoConsoleVariableRef CVarRDGParallelSetup(
TEXT("r.RDG.ParallelSetup"), GRDGParallelSetup,
TEXT("RDG will setup passes in parallel when prompted by calls to FRDGBuilder::FlushSetupQueue.")
TEXT(" 0: pass setup is done synchronously in AddPass;")
TEXT(" 1: pass setup is done asynchronously (default);"),
ECVF_RenderThreadSafe);
```
# Visualize Texture Integration
**vis**
使用vis指令可以打印vis指令帮助信息以及当前帧使用到的所有的资源信息
![[RDG_Vis.jpg|1200]]
**vis [RT Name]**
使用vis [RT Name]可以实时预览当前RT的内容在调试渲染特性的时候可以很方便的Debug
![[RDG_Vis_RTName.jpg|800]]
**vis [RT Name] bump**
打印当前RT到Saved/Screenshots
**vis off**
关闭当前帧的debug模式
# r.RDG.ImmediateMode
将RDG设置成理解执行模式方便进行资源绑定Debug以及断点。
- RDG立即执行模式:
- 立刻执行Pass在其被添加的时候
- 产生和延后执行时一样的功能
- 如果打断点,会非常容易检查其创建的代码
- 由于这个原因所以不能在AddPass后再去更改Pass参数
- 可以利用r.RDG.ImmediateMode在运行时切换
- 会消耗更多的内存可以考虑使用r.Test.SecondaryUpscaleOverride运行在低分辨率下。r.Test.SecondaryUpscaleOverride 设置的参数越大越模糊)
![[RDG_Immediate.png|800]]
- **r.RDG.ImmediateMode 1** / -rdgimmediate : 去除RDG的影响
- **r.RHICmdBypass 1** 去除RHI和并行渲染的影响
- r.RDG.ParallelExecute=0
- r.RDG.ParallelSetup=0
## RDG Async Compute
1.直接设置ComputePassFlags为ERDGPassFlags::AsyncCompute剩下的工作交给RDG自动判断和设置
```c++
ERDGPassFlags ComputePassFlags = (GSupportsEfficientAsyncCompute && CVarTSRAsyncCompute.GetValueOnRenderThread() != 0) ? ERDGPassFlags::AsyncCompute : ERDGPassFlags::Compute;
TShaderMapRef<FTSRClearPrevTexturesCS> ComputeShader(View.ShaderMap);
FComputeShaderUtils::AddPass(
GraphBuilder,
RDG_EVENT_NAME("TSR ClearPrevTextures %dx%d", InputRect.Width(), InputRect.Height()),
ComputePassFlags,
ComputeShader,
PassParameters,
FComputeShaderUtils::GetGroupCount(InputRect.Size(), 8 * 2));
```
2.在Render层调整Pass顺序为RDG提供更多Async Compute Overlap的可能性
# ValidateShaderParameters
ValidateShaderParameters()可以检测RDG绑定的资源是否都存在。
# -rdgdebug
`r.RDG.Debug = 1`来开启。
# RDG Insight
开启RDG Insight Plugin之后即可在UnrealInsight看到额外添加RDG Channel。
命令行启动游戏:
`Game.exe -trace=rdg,defaults`
# DumpGPU
使用DumpGPU指令可以将当前帧的所有Pass和资源信息打印可以很方便的进行查看。
在Console中输入DumpGPU指令会弹出生成好的html文件
![](https://pica.zhimg.com/v2-675aa8a985ccd280ef78e7578d509f16_1440w.jpg)
执行OpenGPUDumpViewer.bat打开网页默认只支持chrome浏览器可以通过修改脚本调用别的浏览器
![](https://pic1.zhimg.com/v2-2fb3021428caca29b8c41b2cb01a0f26_1440w.jpg)
可以看到各个Pass的信息
![](https://pic1.zhimg.com/v2-3732fc0379732e15eaf15d341b08586c_1440w.jpg)
显示当前帧所有CVar的值
![](https://pica.zhimg.com/v2-79ba2f962e6167dfec0f88f08ac3c2aa_1440w.jpg)
比较像素的值:
![](https://picx.zhimg.com/v2-16e264f19d4c0d98b3942fb485115ecf_1440w.jpg)

View File

@@ -0,0 +1,208 @@
---
title: RenderDoc使用技巧
date: 2022-09-30 11:17:29
excerpt:
tags: RenderDoc
rating: ⭐⭐
---
# 前言
参考https://zhuanlan.zhihu.com/p/568990608
>UE5.3需要关闭异步计算让Renderdoc抓帧正常。输入命令即可***r.rdg.asynccompute 0***
**UE5.2之后自动开启Renderdoc**
在DefaultEngine.ini中添加一下配置
```ini
[/Script/RenderDocPlugin.RenderDocPluginSettings]
renderdoc.AutoAttach=True
```
PS. **开启DX12后无法通过Renderdoc进行单步调试**此时可以考虑使用Pix或者切换成DX11。因为DX12的DXIL 着色器不支持着色器调试 https://renderdoc.org/docs/behind_scenes/d3d12_support.html
具体参考
- UE5RayTracing篇-2-——Pix与NSight-Graphics补充 https://zhuanlan.zhihu.com/p/586030650
- UE5使用PIX单步调试DX12环境下的Shader https://zhuanlan.zhihu.com/p/654935138
pix的单步调试需要开启**开发者模式**具体是在window的设置 - 开发者选项 - **开发人员设置**
## 抓帧技巧
- [RenderDoc抓帧steam平台](https://zhuanlan.zhihu.com/p/721764908)
- 关闭并行绘制相关命令:
- **r.RHICmdBypass=1**
- **r.MeshDrawCommands.ParallelPassSetup=0**
- **r.MeshDrawCommands.UseCachedCommands=1**
- **r.RDG.ImmediateMode=1**
# UE相关设置
开启Renderdoc的PixelDebug功能
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20220930121129.png)
UE5.3 开启调试的需要开启:
- r.Shaders.Symbols=1
- r.Shaders.Optimize=0
- r.DisableEngineAndAppRegistration=1
## UE5中的改动
UE5中这些名称有了一定的变化
| 旧名称 | 新名称 | 注解 |
| ---------------------------------- | ------------------------ | -------------------------------------- |
| r.Shaders.KeepDebugInfo | r.Shaders.Symbols | 通过生成符号并将其写入主机的磁盘来启用着色器调试PC符号仍以内联方式存储。 |
| r.Shaders.KeepDebugInfo(被划分为两部分) | r.Shaders.ExtraData | 生成着色器名称和其他"额外"着色器数据。 |
| r.Shaders.PrepareExportedDebugInfo | r.Shaders.GenerateSymbol | 生成符号,但不将其写入磁盘(备注符号存储在DDC中) |
| r.Shaders.ExportDebugInfo | r.Shaders.WriteSymbols | 如果符号已生成,则将其写入磁盘。 |
## 其他设置
```ini
renderdoc.BinaryPath  // 查看RenderDoc的安装路径
renderdoc.BinaryPath "C:\Program Files\RenderDoc"  // 设置RenderDoc的安装路径为C:\Program Files\RenderDoc
renderdoc.CaptureAllActivity 1   // 勾选CaptureAllActivity获取编辑器所有viewport和窗口的渲染数据而不仅仅是当前viewport  获取UI的Draw需要开启该开关
renderdoc.CaptureCallstacks // 查看CaptureCallstacks获取图形API的调用堆栈是否勾选
renderdoc.EnableCrashHandler 0 // 取消勾选EnableCrashHandler截帧崩溃时是否使用RenderDoc的crash handler
renderdoc.ReferenceAllResources  // 查看ReferenceAllResources获取所有mesh、材质纹理等渲染资源开启该选项会导致帧文件很大是否勾选
renderdoc.SaveAllInitials 1 // 勾选SaveAllInitials获取所有mesh、材质纹理等渲染资源的初始状态开启该选项会导致帧文件很大
renderdoc.ShowHelpOnStartup  // 查看ShowHelpOnStartup启动编辑器时是否弹出RenderDoc的帮助对话框是否勾选
```
>调试Slate所需命令renderdoc.CaptureAllActivity 1
## 截帧命令
- renderdoc.CaptureFrameCount  10  // 连续截10帧并保存到一个rdc文件中
- renderdoc.CapturePIE 12 // 在编辑器中将当前地图Play然后连续截取12帧
- renderdoc.CaptureDelayInSeconds 0   // 设置Delay的单位为帧
- renderdoc.CaptureDelayInSeconds 1   // 设置Delay的单位为秒
- renderdoc.CaptureDelay 15  // 当Delay的单位为帧时表示设置延迟15帧当Delay的单位为秒时表示设置延迟15秒
//  这个只是设置仍然需要调用renderdoc.CaptureFrame等来发起截帧动作
## 重新编译Shader
- r.RecompileRenderer重新编译所有RenderModule。
- recompileshaders位于`bool RecompileShaders(const TCHAR* Cmd, FOutputDevice& Ar);`可以编译指定的Material。命令默认编译所有Shader快捷键是Ctrl+Shift+.。`recompileshaders material <material name>`
- Changed编译修改过文件
- Global编译GlobalShader
- Material **MaterialName**:附带一个参数材质名称
- All所有文件
- **ShaderFileName**编译指定的Shader
有人说`recompileshaders <USF FileName>`可以只编译指定的USF文件但实际测试会报错。或许可以试试Material版本比如`recompileshaders material M_SGSSS`
## 截取非管线Shader的方法
在你EnqueueRenderCommand前加一个FScopedCapture 跑到你的Cmd的时候就可以自动Renderdoc截帧 ,类为FcopedCapture。
# Renderdoc本身相关
## 使用技巧
### 修改ms显示耗时
![](https://pic1.zhimg.com/80/v2-804879d0e02dbd0622f6480b9dd5040c_720w.webp)
### 过滤高耗时DrawCall
使用$action(duration > 0.8ms) 进行过滤
![](https://pic4.zhimg.com/80/v2-6598ae8de61ecf7256aa2b2860fa622b_720w.webp)
### **调试VS**
Mesh Viewer中vs input选中或在preview窗口中鼠标右键选中顶点在选中顶点行上右键debug thie vertices
![](https://pic3.zhimg.com/80/v2-3001ac53f0fa085e47df236c0430d2ea_720w.webp)
### **调试PS**
Texture Viewer中右键选择像素在Pixel Context中心就是选中的像素选择需要调试的历史时间点击“Debug”调试
![](https://pic1.zhimg.com/80/v2-c7ab8ffce562b57fe12234a1a39952c4_720w.webp)
### 修改VS
![](https://pic4.zhimg.com/80/v2-b7acd2f64495b688274e6bb5ca6ea06b_720w.webp)
选中dc高亮绘制
![](https://pic1.zhimg.com/80/v2-246cc1577f0a61d68926299a30e488d8_720w.webp)
Pipeline state进入VS
![](https://pic2.zhimg.com/80/v2-37211dff3c6e57067255d6e91d08c6a1_720w.webp)
修改坐标
![](https://pic1.zhimg.com/80/v2-16f647910f37dc54ba7e09c199813a60_720w.webp)
Texture View中预览位置变化
### 修改PS
![](https://pic1.zhimg.com/80/v2-ba7d6b23e94fcf541c5815beacfbf674_720w.webp)
进入pipeline state 编辑ps
![](https://pic3.zhimg.com/80/v2-7442e83ed016b30a3bdd1745912c9c6e_720w.webp)
修改前颜色
![](https://pic2.zhimg.com/80/v2-4878401ef7cae939c76912135106500d_720w.webp)
修改base color为红色
![](https://pic3.zhimg.com/80/v2-cb6a39670c6d94c8703314239f00ebd2_720w.webp)
修改后效果预览
### 查看深度模板测试结果
![](https://pic1.zhimg.com/80/v2-10b497754fb1ed7ba0e12ced038e6fd4_720w.webp)
红色测试不同多,绿色测试通过
### 查看纹理在那些事件引用
![](https://pic4.zhimg.com/80/v2-ee8e0720527ca27045b8cefdeb483433_720w.webp)
![](https://pic2.zhimg.com/80/v2-8c3ed3a794c7b2fca04d8fda4ade6195_720w.webp)
PS 资源种点击链接
![](https://pic1.zhimg.com/80/v2-c70907dd5c33daf560f1be6405bc2a34_720w.webp)
Resource Inspector中右侧查看那些事件使用了此资源
### 纹理太暗
![](https://pic3.zhimg.com/80/v2-d7bdb13af09c789d374523b5df1e6b7e_720w.webp)
![](https://pic2.zhimg.com/80/v2-07d9e1d97230e47a22d641aae5cbbaa1_720w.webp)
### **查看DrawCall耗时**
![](https://pic2.zhimg.com/80/v2-9fc83fdaadf6a453e9dbccefb83ff65d_720w.webp)
### 查看纹理输入输出
![](https://pic2.zhimg.com/80/v2-f464f36300516d1c4c613820d2779fbd_720w.webp)
![](https://pic4.zhimg.com/80/v2-3e224c777f579d5bdcc8752a06231217_720w.webp)
### 重名名纹理
![](https://pic4.zhimg.com/80/v2-a08a7d270a4c8de3c952298ba209bcfb_720w.webp)
### 如何对比数据
将过滤后的数据导出为文本使用对比工具进行对比。用于发现dc耗时问题
![](https://pic3.zhimg.com/80/v2-358566c0e1500019840fc914d7394fc2_720w.webp)
![](https://pic4.zhimg.com/80/v2-84f8f79ac5d241946aeabaa59576a947_720w.webp)
![](https://pic4.zhimg.com/80/v2-6dca8e57407f84970125b9114b9bde2f_720w.webp)
# 命令行启动Renderdoc截帧
相关命令可以使用`renderdoccmd.exe -h`来查看:
- -d工作目录
- -w运行到最后再启动。
- --opt-hook-children捕获子进程。
- 最后填写运行exe程序路径。
```bash
renderdoccmd.exe capture -d "C:\Game\ScarletNexus" -w --opt-hook-children C:\Game\ScarletNexus\ScarletNexus.exe
```·

View File

@@ -0,0 +1,142 @@
---
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

View File

@@ -0,0 +1,57 @@
---
title: UE5RayTracing篇-2-——Pix与NSight-Graphics补充
date: 2022-11-11 17:53:44
excerpt:
tags:
rating: ⭐
---
## 前言
最近继续学习Rtx所以就总结一下相关debug工具的使用方法。当然如果你是A卡用户大概就需要[【新鲜资讯】Radeon™光线追踪分析器RRA1.0正式上线](https://zhuanlan.zhihu.com/p/549772737)。
## Pix
下载地址位于https://devblogs.microsoft.com/pix/download/
1. 首先启用`Pix for UnrealEngine`插件。
2.`ConsoleVariables.ini`中添加`r.D3D12.AutoAttachPIX=1`,或者在启动命令也就是`CommandLineArguments`最后添加`-attachPIX`
3. 在Pix中设置启动参数点击启动就可以截帧了。
>注意Pix与RenderDoc插件冲突需要关闭RenderDoc插件才能正常运行。
可以通过点击GUI中的照相机图标或者按下键盘上的PrintScreen截图键键来截帧。直接点击摄像机图标是没办法截到场景信息的所以只能用鼠标点击场景窗口让窗口获得焦点之后再按截图键才能截到。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114134346.png)
查看渲染过程只需要GPUCapture如果要调试性能就需要使用TimingCapture。具体操作可以参考PIX的操作视频教程位于https://www.youtube.com/watch?v=rLClOkrE47w&list=PLeHvwXyqearWuPPxh6T03iwX-McPG5LkB&index=2
PS.Collect Timing Data需要在win10上开启`开发人员模式`,具体操作为
1. 打开开始菜单,输入`开发者`
2. 进入`开发者选项`,勾选开发人员模式。
### 4个功能Tab
Pix的主要功能集中在这4个Tab中。
Overview主要是展示一下EventList在点击`CollectTimingData`下方会显示时间轴。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114155739.png)
Pipeline显示当前Event的Shader、管线状态以及其他相关数据。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114152359.png)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114151354.png)
想要DebugShader可以在Pipeline找到对应Shader并在Shader文件上右键点击`Open In Debugger`后进行调试。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114154405.png)
当然也可以在输入的RT上双击鼠标左键之后点击`DebugPixel`进行debug。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114154555.png)
Debugdebug时需要点击左上方Overview下面的运行按钮这里我已经点了。这里我很好奇为啥没有类似Renderdoc的断点功能。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114155712.png)
Tools大概是一个测试性能的工具可以测试Basic Information、Depth/Stencil、Primitives and Rasterization、Bandwidth、TDR Analysis、ExecuteIndirect。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221114155948.png)
## NSight For VisualStudio
之后测试了一下NSight的VS插件虽然本质上就是一个帮你填写启动参数的工具但的确方便。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111175647.png)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111175715.png)
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111182344.png)
测试完之后就能查看光追的一些参数。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20221111183638.png)

View File

@@ -0,0 +1,47 @@
---
title: Untitled
date: 2025-07-28 10:06:02
excerpt:
tags:
rating: ⭐
---
# 前言
- DXBC/DXIL 反汇编HLSL Decompiler:https://zhuanlan.zhihu.com/p/1927111489627599176
# 正文
## 项目背景
从 UE5 和 DirectX12 的时代开始,[Shader Model 6.0](https://zhida.zhihu.com/search?content_id=260234833&content_type=Article&match_order=1&q=Shader+Model+6.0&zhida_source=entity)+ 和它的新编译格式 DXIL已经接替老旧的 [DXBC](https://zhida.zhihu.com/search?content_id=260234833&content_type=Article&match_order=1&q=DXBC&zhida_source=entity) 成为新时代的标配。这意味着,当我们截帧分析基于 UE5 + DX12 的游戏时,看到的 Shader 代码不再是熟悉的 DXBC而是 DXIL 了。
对于热衷于深挖渲染管线一探究竟的逆向爱好者来说,这带来了一个痛点:我们急需一个能将 DXIL 反编译回可读性强的 HLSL 源码的工具。
## HLSL 反编译的历史
在 DXBC 时代Shader Model 5.1 及之前),开源项目 [3Dmigoto](https://link.zhihu.com/?target=https%3A//github.com/bo3b/3Dmigoto) 旗下的 [HLSLDecompiler](https://link.zhihu.com/?target=https%3A//github.com/bo3b/3Dmigoto/tree/master/HLSLDecompiler) 堪称神器。
它甚至被专门 Fork 出来([zxxyye/HLSLDecompiler](https://link.zhihu.com/?target=https%3A//github.com/zxxyye/HLSLDecompiler)),集成到 [RenderDoc](https://zhida.zhihu.com/search?content_id=260234833&content_type=Article&match_order=1&q=RenderDoc&zhida_source=entity) 中作为插件使用,并收获了 300+ Star 和 100+ Fork足见其受欢迎程度和逆向需求的旺盛。
## 现在与将来
然而,时代变了。[3Dmigoto](https://link.zhihu.com/?target=https%3A//github.com/bo3b/3Dmigoto) 项目本身已经陷入沉寂,其下的 [HLSLDecompiler](https://link.zhihu.com/?target=https%3A//github.com/bo3b/3Dmigoto/tree/master/HLSLDecompiler) 子模块更是多年未曾更新。
根据作者在 [Issue #358](https://link.zhihu.com/?target=https%3A//github.com/bo3b/3Dmigoto/issues/358) 中的说法,这个反编译器对 Shader Model 4.0 为止的 DXBC 代码具有良好的支持性,然而对于 Shader Model 5.0+ 的着色器代码已是捉襟见肘,并且大概率不会再有任何更新。
实际体验也印证了这点。很多 Shader Model 5.0+ DXBC 的基础指令(甚至包括 `numthreads`)它都翻译不出来,已经完全无法满足现代游戏分析的需求。
一言以蔽之,老工具已无法胜任 DXIL 和部分 DXBC 的反编译工作。为了解决这个痛点,我们需要打造一个全新的逆向分析工具:[HLSL-Decompiler](https://link.zhihu.com/?target=https%3A//github.com/YYadorigi/HLSL-Decompiler)。
它的目标很明确:高效、准确地将 DXBC / DXIL / [SPIR-V](https://zhida.zhihu.com/search?content_id=260234833&content_type=Article&match_order=1&q=SPIR-V&zhida_source=entity) 反编译回可读的 HLSL 源码,并且能无缝集成到 RenderDoc 中,真正做到「开箱即用」,接续前人未完成的使命。
## 项目简述
### 开源库
本项目基于如下开源库。它们权威,高质量,并且正活跃地持续维护。
- [DirectXShaderCompiler (DXC)](https://link.zhihu.com/?target=https%3A//github.com/microsoft/DirectXShaderCompiler/tree/main):微软官方提供的现代 HLSL 编译器。其中包括关键组件 [dxbc2dxil](https://link.zhihu.com/?target=https%3A//github.com/microsoft/DirectXShaderCompiler/tree/main/projects/dxilconv/tools/dxbc2dxil),将老式 DXBC 转换为 [LLVM IR](https://zhida.zhihu.com/search?content_id=260234833&content_type=Article&match_order=1&q=LLVM+IR&zhida_source=entity) 形式的 DXIL。
- [dxil-spirv](https://link.zhihu.com/?target=https%3A//github.com/HansKristian-Work/dxil-spirv/tree/master):将 DXIL 或其 LLVM IR 形式高效地转换为 SPIR-V。作者同时也是 [SPIRV-Cross](https://link.zhihu.com/?target=https%3A//github.com/KhronosGroup/SPIRV-Cross/tree/main) 的重要贡献者。
- [SPIRV-Cross](https://link.zhihu.com/?target=https%3A//github.com/KhronosGroup/SPIRV-Cross/tree/main)KhronosGroup 官方维护的 SPIR-V 反汇编工具,支持从 SPIR-V 到 HLSL 的转换。
### 工具链
该项目的核心就是巧妙地串联起上述库,形成一个高效的反编译流水线。原理如下图所示。
![](https://pic1.zhimg.com/v2-52e1214206c0ec9fcec5e6cf100f5040_1440w.jpg)
### 为什么你需要它?
- **分析 UE5 / DX12 游戏渲染管线**:轻松查看截帧得到的 DXIL Shader 源码。
- **逆向老旧 DXBC (SM5.1)**:老工具搞不定的,它能搞定。
- **研究 Vulkan Shader (SPIR-V)**:方便地将 SPIR-V 转回 HLSL 进行分析或移植。
- **RenderDoc 插件集成**:安装即用,分析体验丝滑流畅。
- **开源 & 活跃**:基于活跃项目构建,持续维护更新有保障。
### 项目地址
项目已开源在 GitHub[https://github.com/YYadorigi/HL](https://link.zhihu.com/?target=https%3A//github.com/YYadorigi/HLSL-Decompiler)