更具体的OpenGL错误信息

Dol*_*000 2 opengl debugging error-handling jogl

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

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

如果有办法找出OpenGL命令实际标记错误的方法,以及有关标记错误的更多细节(如果我得到GL_INVALID_VALUE,什么值对哪个参数无效以及为什么?),将会非常有用.

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

And*_*man 5

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

尽管如此,请参阅这篇文章 - 尽管它只是OpenGL 4.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.
Run Code Online (Sandbox Code Playgroud)

它不仅会为您提供错误信息,而且甚至可以为您提供性能警告,例如使用8位顶点索引(桌面GPU不喜欢)做一些愚蠢的事情.


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