更具体的OpenGL错误信息

时间:2013-12-21 07:10:43

标签: debugging opengl error-handling jogl

当OpenGL标记错误时,有没有办法检索更详细的错误信息?我知道核心OpenGL中没有,但是可能有一些常见的扩展或平台或驱动程序依赖的方式或任何东西?

我的基本问题是我有一个游戏(用Java编写的JOGL),当人们遇到麻烦时,他们在某些硬件/软件配置上做了什么,可能很难找到根的地方问题在于。出于性能原因,我不能继续为每个命令调用glGetError,而只是在程序中的几个点上这样做,所以甚至很难找到甚至标记错误的命令。然而,即使我可以使用非常一般的错误代码,OpenGL也没有真正告诉我所发生的事情(看看命令上的联机帮助页甚至描述了各种错误代码如何重复使用,有时甚至很多不同实际的错误条件)。

如果有办法找出OpenGL命令实际标记错误的方法,以及有关标记错误的更多详细信息(如果我得到GL_INVALID_VALUE,那将是非常有用的论证是无效的,为什么?)。

看起来有点奇怪,司机不提供这些信息,即使是以完全自定义的方式,但看起来像我一样,我肯定没有找到任何方法来找到它。如果真的是他们不这样做,那么为什么会有这么好的理由呢?

2 个答案:

答案 0 :(得分:5)

实际上,核心OpenGL中有一个功能可以为您提供详细的调试信息。但是,您必须将最低版本要求设置得相当高,才能将其作为核心功能。

尽管如此,请参阅this article - 即使它只是OpenGL 4.3中的核心,它在扩展形式中存在了相当长的一段时间,并且它不需要任何特殊的硬件功能。因此,在大多数情况下,您真正​​需要的是最近来自NV或AMD的驱动程序。

我有一个如何在answer I wrote a while back中使用此扩展的示例,其中包含一些实用程序函数,以使输出更易于阅读。它是用C语言编写的,所以我不知道它会有多大帮助,但你可能会发现一些有用的东西。


以下是您可以从此扩展程序(AMD Catalyst)获得的输出类型:

OpenGL Error:
=============
 Object ID: 102
 Severity:  Medium
 Type:      Performance
 Source:    API
 Message:   glDrawElements uses element index type 'GL_UNSIGNED_BYTE' that is not
            optimal for the current hardware configuration; consider using 
            'GL_UNSIGNED_SHORT' instead.

它不仅会为您提供错误信息,而且甚至会为您提供性能警告,例如使用8位顶点索引(桌面GPU不喜欢)这样做的傻事。


要回答另一个问题,如果将调试输出设置为同步并在调试回调中安装断点,则可以轻松地使任何调试器中断OpenGL错误。如果检查callstack,您应该能够快速确定API调用产生的错误。

答案 1 :(得分:1)

以下是一些建议。

  • 根据手册页,glGetError返回错误标志的值,然后将其重置为GL_NO_ERROR 。我会使用这个属性来追踪你的错误 - 如果没有别的你可以在你调用它的地方切换它并进行二进制搜索以找到错误发生的位置。

  • 我怀疑调用glGetError会给你带来性能损失。它只是回读一个错误标志。

  • 如果您无法在人们拥有的特定硬件/软件配置上进行测试,则可能会非常棘手。毕竟,OpenGL驱动程序是针对特定设备实现的。

  • glGetError基本上说上一行被搞砸是有好处的。这应该给你一个很好的起点 - 你可以在手册页中查找为什么该函数会抛出错误,而不是试图根据它的枚举名来弄清楚它。

  • 您可能需要检查其他特定的错误函数,例如glGetProgramivglGetFramebufferStatus,因为glGetError不检查每种类型错误。 IE只是因为它读得干净并不意味着没有发生另一个错误。