更具体的OpenGL错误信息



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

我的基本问题是,我有一个游戏(用JOGL用Java编写),当人们在某些硬件/软件配置上遇到问题时,很难找到问题的根源。出于性能原因,我不能一直为每个命令调用glGetError,而只能在程序中的几个点上这样做,所以甚至很难找到哪个命令一开始就标记了错误。然而,即使我可以,OpenGL拥有的极其通用的错误代码也并没有真正告诉我发生了什么(比如命令上的手册页甚至描述了各种错误代码是如何在许多不同的实际错误条件下重复使用的)。

如果有一种方法可以找出OpenGL命令实际标记的错误,以及标记的错误的更多细节(比如,如果我得到GL_INVALID_VALUE,什么参数的值无效,为什么无效?),这将非常有帮助。

司机们不会提供这些信息,即使是以完全自定义的方式,这似乎有点奇怪,但就我而言,我肯定没有找到任何方法来找到这些信息。如果真的是他们没有,有什么好的理由吗?

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

尽管如此,请参阅本文——尽管它只在OpenGL4.3中成为核心,但它以扩展形式存在了很长一段时间,并且不需要任何特殊的硬件功能。因此,在大多数情况下,你真正需要的只是NV或AMD的最新驱动程序。

我在不久前写的一个答案中有一个如何使用这个扩展的例子,其中包括一些实用函数,使输出更容易阅读。它是用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错误时中断。如果检查调用堆栈,您应该能够快速准确地识别API调用产生的错误最多。

以下是一些建议。

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

  • 我怀疑打电话给glGetError会对你的表现产生影响。它所做的只是读取一个错误标志。

  • 如果你没有能力在这些人拥有的特定硬件/软件配置上进行测试,这可能会很棘手。OpenGL驱动程序毕竟是为特定设备实现的。

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

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

相关内容

最新更新