调试着色器代码?


13

我正在编写一个游戏引擎,当我使用透视相机时,屏幕会黑屏。我不会确切地问这是为什么,因为会有很多代码要共享,并且坦率地说,我认为即使打扰大家,这也是一个小问题。

麻烦在于我不知道如何调试它。所有更改都是我的投影矩阵,如果我的投影矩阵看起来不错,我不知道为什么它不起作用。理想情况下,我将在着色器进行计算时打印出各种东西的值,但是GLSL不方便地没有printf()函数。

所以我的问题是:如何调试我的问题?我唯一想到的就是在客户端检查尽可能多的值,然后通过置换进行编程,但是我这样做并没有成功。有什么方法可以查看视频卡中发生的情况?我可以使用一种完全不同的技术吗?

我使用的是GLSL 420版(以及该版本的特定功能),因此考虑到上次更新是2010年,我不认为glslDevil是一个选项。

编辑

我设法通过一些完全不相关的调试解决了我的问题。

Answers:


2

您还可以使用glIntercept之类的程序,该程序类似于PIX,但随后用于OpenGL。除了拦截和记录所有调用之外,还可以显示着色器使用情况并在运行时编辑着色器。最后一个选项(在运行时编辑着色器)在调试时可能非常有用,因为您可以继续进行部分编辑,直到出现问题为止,并且可以通过输出颜色来快速调试值。

http://code.google.com/p/glintercept/


看起来确实有用。我将测试它是否可以与GLSL 4.20 EDIT配合使用:出于某些原因,我认为它不起作用。它依赖于许多不推荐使用的OpenGL特性,因此不在我的着色器代码中。
阿维

太糟糕了,我不知道那年这么老。GLSL4.2必须有某种调试器。我会问周围。同时,这可能有效吗?developer.nvidia.com/content/nvidia-shader-debugger#Features
Roy T.

仅适用于Cg着色器:|
阿维(Avi)2012年

4

尽管我不确定,但NVIDIA Nsight应该能够调试着色器,至少我认为它在某些以前的版本(您应该可以找到)中支持GLSL。它可以很好地与Visual Studio集成,这并不容易,但是有很多有用的东西,但是在较旧的版本中,您需要2台具有GPU的机器,每台机器都可以通过网络调试着色器(而最新版本则表示它允许“本地”调试) 。同样,检查Shader Designer [2],它似乎是一个有用的IDE(但缺少GLSL调试)。

[1] http://developer.nvidia.com/content/nvidia-nsight-visual-studio-edition

[2] http://www.opengl.org/sdk/tools/ShaderDesigner/


请注意,NSight需要管理员权限才能实际调试着色器。
starbeamrainbowlabs 16-4-22

1

不幸的是,调试opengl并不容易。这些是我发现有用的东西:

  • 每次调用后使用glGetError
  • 尝试使用新的调试扩展(ARB_debug _ ???)
  • 使用gDebugger查看每次调用后屏幕上显示的内容
  • 使用apitrace查看每个opengl命令之后会发生什么
  • 修改您的着色器以根据当前输入输出不同的颜色,并尝试了解为什么它显示某种颜色
  • 禁用所有限制绘图功能的opengl功能:剪刀测试,深度测试,背面剔除等。

1
这实际上并不能回答我的问题。这对于调试客户端OpenGL调用很有帮助,但对调试着色器程序却没有帮助。我知道如何调试客户端OpenGL调用。
阿维(Avi)2012年

1

我个人仍然使用RenderMonkey。但是,这并不完全适合这个确切的问题,因为它只是真实应用的外观,因此有一些奇怪的限制。完全超出了支持范围,但我发现调试GLSL时找不到更好的方法。


我不确定rendermonkey是否是我想要的,尤其是像照相机运动之类的东西将依赖于修改gl_ModelViewProjectionMatrix时,我不使用它。
阿维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.