着色器是在 GPU 上运行的专用程序,可处理光线、像素、顶点和纹理,以实现独特的视觉效果。借助着色器,您可以为渲染的图像添加创意表达和真实感。它们在光线追踪中对于模拟逼真的光照、阴影和反射至关重要。
我们喜欢着色器,但它们可能很难调试。着色器计算非常复杂,并且跨多个线程运行,这可能会导致同步问题和难以重现的不一致错误。开发者通常必须手动追踪着色器逻辑,确定正在访问的资源,并推断错误发生的位置。这一过程效率低下,通常需要逐步注释着色器的某些部分,以测试和定位问题:一种容易出错的策略。
由于渲染技术如降噪等使用了循环缓冲区,因此会带来额外的挑战。这些缓冲区中的错误会跨帧传播,因此很难确定根本原因。同样,传统调试工具通常无法提供必要的见解,因此您不得不采用手动调试技术来追踪多个通道并找到问题的根源。
NVIDIA Nsight Graphics 中的全新着色器调试器
NVIDIA 清楚地表明,图形社区需要功能强大、直观的着色器调试工具来满足这些需求。今天,NVIDIA 发布了 NVIDIA Nsight Graphics 中的新着色器调试器。该工具为 Vulkan 应用程序提供测试版,使您能够实时调试数百或数千行长的复杂着色器。
Shader Debugger 代表了 GPU 调试技术的重大飞跃,为诊断和解决着色器问题提供了硬件加速解决方案。该工具旨在支持光线追踪、光栅和计算着色器(即将推出网格着色器支持),使您能够快速调试原本需要更长时间才能解决的问题。借助 Shader Debugger,您可以快速确定并解决问题的根源,例如不正确的法线计算、环境光遮蔽错误和纹理映射问题。
图 1 展示了在 NVIDIA Omniverse 示例中调试光线生成着色器的示例。正在检查 Warp View。每一行都是 warp,绿色单元格表示 warp 中的线程,红色单元格表示线程已停止在当前断点。
使用 Nsight Graphics 调试着色器使用熟悉的调试工作流程。主要功能包括:
- 实时调试:您可以在应用程序运行时检查和修改着色器代码,从而更轻松地实时识别和解决问题。
- 设置断点:暂停执行带有源级断点的着色器并检查变量,这与传统 CPU 调试类似。这允许逐步执行和分析着色器代码。
- 条件断点:为断点添加条件以隔离特定场景或值,通过专注于工作负载的相关区域简化调试过程。
- Locals 和 Watch 窗口:使用 Locals 或 Watch 窗口检查断点处的变量值,从而更轻松地识别差异以及值偏离预期的位置。
- Warp 信息和 Focus Picker:Warp View 概述了线程执行状态,而 Focus Picker 则提供了着色器活动的图形视角。这些工具使开发者能够在上下文中可视化和理解 GPU 行为。
着色器调试器入门
当您将 Nsight Graphics 连接到目标应用时,您会发现 Shader Debugger 是一个新的可选择活动。选择要分析的应用可执行文件。如果您使用主机通过网络调试目标,请确保您已连接到目标系统。图形以全速运行,直到达到指定的断点,因此在导航到感兴趣的位置进行调试时不会影响性能,并在调试时尽可能减少开销。
着色器调试器功能
启动着色器调试器后,系统将首先显示所有图形管线及其包含的着色器。在图 2 中,程序和着色器显示在左侧的列表中。单击左键即可打开具有屏幕空间环境光遮蔽(Screen Space Ambient Occlusion,SSAO)的着色器,并在右侧显示相应的源代码。
通过设置断点,您可以在特定点暂停执行着色器代码,这与传统调试工具类似。当达到断点时,应用程序会暂停,您可以检查着色器的状态,包括本地变量。通过检查着色器执行中特定点的变量,您可以诊断问题。
您还可以逐行浏览着色器代码,看着变量如何被填充以及着色器逻辑如何执行。这是一个用于了解着色器如何识别问题的强大工具。当前范围内的变量显示在 Locals 窗口中。
扭曲视图
Warp View 概述了着色器单元级别的 GPU 驻留内容。它显示了当前断点处的线程束以及线程束中的哪些线程在该断点处停止。这有助于您了解着色器是如何在 GPU 上执行的。
在图 3 所示的表中,每一行都表示一个 warp,每个块是该 warp 中的一个线程。红色块表示已在您设置的断点处停止的线程,而绿色块表示未在当前断点处停止的线程。您可以选择单个线程以检查相应的局部变量。
焦点拾取器
Focus Picker 可帮助您可视化您正在调试的着色器代码和低级 GPU 执行对渲染结果的影响。它提供了当前正在运行的片段的视觉显示,允许您检查这些片段叠加在当前渲染目标上。Focus Picker 显示当前以浅蓝色着陆的片段,以及正在运行的黄色片段。
在图 4 中,Focus Picker (左) 显示了每个单个像素构建时的渲染目标。您可以逐步浏览正在渲染的场景,并检查相应的变量、线程束、线程和单个片段的源代码。逐步浏览源代码将显示正在生成的片段的进度。单击任意单个片段即可开始检查和调试。
着色器调试器硬件要求
Shader Debugger 需要双 GPU 本地系统或网络设置,其中一个系统托管 NVIDIA Nsight Graphics,另一个系统运行目标应用程序。Shader Debugger 除了任何其他独立或集成的 GPU 外,还可与 NVIDIA Ampere GPU 及更高版本的 GPU 配合使用。NVIDIA Nsight Graphics 还支持远程调试。
计算工作负载支持指令级抢占以中断代码执行进行调试,因此您可以逐步执行指令来检查程序的状态。但图形工作负载仅支持基元级抢占,这允许在三角形级别抢占 GPU,而不是按光线、顶点或片段抢占。调试任务需要指令级精度,因此 Nsight Graphics 使用双 GPU 设置来进行精确的着色器调试。
详细了解 Nsight Graphics 2024.2
Nsight Graphics 2024.2 中包含更多新功能,可加速图形调试和分析工作流程。查看 SIGGRAPH 2024 大会上的开发者工具聚焦视频,了解 Nsight Tools 的最新创新成果。
结束语
Nsight Graphics Shader Debugger 是图形开发者旨在调试应用并实现高质量视觉结果的必备工具。其强大的功能集和硬件加速性能可确保调试复杂着色器的过程比以往更容易访问和高效。
着色器调试器现已提供 Vulkan 应用的测试版。下载 Nsight Graphics 2024.2 开始使用。在 Nsight Graphics 窗口右上角的“Feedback”(反馈)按钮下,分享您在测试版中的体验。
浏览更多 Nsight 开发者工具和教程。在 Nsight Graphics 开发者论坛上提出问题、提供反馈并与图形开发者社区互动。