ShaderJoy ——GLSL 调试技巧入门【OpenGL】

3,349 阅读4分钟

这是我参与8月更文挑战的第12天,活动详情查看: 8月更文挑战

使用Nsight图形调试器

调试 GLSL 着色器代码是出了名的困难。与 C++ 或 Java 等典型语言的编程不同,着色程序在哪里失败往往是不明确的。通常,一个着色器错误表现为一个空白屏幕,不提供任何关于错误本质的线索。更令人沮丧的是,没有办法在运行时打印出着色器变量的值,就像人们通常在跟踪一个难以捉摸的 bug 时所做的那样。 缺乏显示着色器变量的简单能力是一个严重的障碍,由于这个原因,显卡制造商有时在硬件中提供在运行时从着色器中提取信息的功能,并以图形调试器的形式构建了访问信息的工具。每个制造商的调试工具只能在该制造商的显卡存在的情况下工作。NVIDIA 的图形调试器是一个更大的工具套件 Nsight 的一部分, AMD 也有一个类似的工具套件叫做 CodeXL

关于英伟达 Nsight

Nsight 是一套 NVIDIA 的工具,它包含一个图形调试器,当程序运行时,它可以查看 OpenGL 图形管道的各个阶段,包括着色器。不需要更改或添加任何代码。只需在启用 Nsight 的情况下运行现有程序。Nsight 允许在运行时检查着色器,比如查看着色器的统一变量的当前内容。有些版本甚至允许在运行时更改着色器代码。

有适用于 WindowsLinux/MacOSNsight 版本,可以与微软的 Visual Studio (VS)Eclipse IDE 交互。我们只讨论 WindowsVisual Studio

Nsight 只能与 NVIDIA 显卡兼容;它不适用于英特尔或 AMD 显卡。完整的支持卡列表可在 NVIDIA 网站查询

Nsight 正在迅速变化,Nsight 可能会有更多令人兴奋的变化和发展

设置 Nsight

有多种方法可以设置 Nsight 并将其整合到 Visual Studio 中。根据你安装的版本,Nsight 菜单将被添加到最顶部的 VS 菜单或作为 “扩展” 菜单的子菜单。我们安装 Nsight 的方式如下:

1. 安装 NVIDIA Nsight Graphics,网址为 developer.nvidia.com/nsight-grap… 我们安装了2020.4版本。

2. 在 Visual Studio 中,使用 Extensions►Manage Extensions 来搜索和安装 Nsight 集成。“Nsight” 菜单应该出现在顶部菜单栏或扩展项下的子菜单。

在 Nsight 中运行 C++ / OpenGL 应用程序

  1. 加载希望运行的程序。在 “Nsight” 菜单中,选择 “Frame Debugger” 或 “Start Graphics Debugging” (取决于你的版本和安装)来运行你的程序,如下所示:

image.png

  1. 可能会弹出一个窗口,询问您是否想要“无安全连接?” 如果是,那么点击“连接不安全”。可能还会出现一个窗口,显示与 Nsight 的连接,并询问您是否希望启动帧调试器。如果是,那么点击 “Launch Frame Debugger” ,如下所示:

image.png

  1. 然后应该执行 C++ /OpenGL 图形程序。根据您的安装,各种窗口可能会出现在您正在运行的程序旁边。Nsight也可以在你运行的程序上叠加一些信息,如下所示:

image.png

  1. 程序运行后,在你希望检查的任何区域与它进行交互。此时,您需要暂停执行。在一些安装中,这是通过 Nsight菜单中选择 “暂停和捕获帧” 来完成的,而在其他版本中,这是通过在运行窗口中按 CTRL+Z ,然后单击 “暂停进行实时分析” 按钮来完成的。

image.png

  1. 应该会出现 Frame 调试器屏幕,以及一个 HUD 工具栏和一个水平选择工具,称为 “scrubber” 。您的程序可能会在此时冻结。在调试器屏幕的中心是一个左栏,上面有每个着色器阶段的按钮。例如,你可以为 “Vertex Shader” 突出 “VS” ,在其右侧较大的中心框中,你可以向下滚动并查看统一变量的内容(假设你在它上面选择了“ API 检查器”)。下图中,“proj_matrix” 右侧的小框已经打开,显示出 4x4 投影矩阵的内容

image.png

  1. 出现的另一个有趣的窗口与正在运行的程序相似。这个窗口的底部有一个时间轴,您可以通过单击来查看绘制在框架上的项目序列。下面是一个例子。注意,光标已单击时间轴的左侧区域,它将显示到该点的那些项目

image.png

有关如何最大限度地利用 Nsight 工具的详细信息,请参阅 Nsight 文档。