什么时候应该调用glGetError?

时间:2009-12-26 13:03:55

标签: opengl tao-framework

glLoadIdentity

  如果生成

GL_INVALID_OPERATION   glLoadIdentity在。之间执行   执行glBegin和。{   相应执行glEnd

但是GL_INVALID_OPERATION是一个由glGetError返回的标志。

我的问题是,我们什么时候应该调用glGetError(为了知道我们是否按照正确的顺序调用opengl)?

3 个答案:

答案 0 :(得分:22)

我不确定你的问题是关于什么时候你可以在glBegin / End里面调用glGetError,或者它是否是一般关于glGetError使用的更普遍的问题。所以我会回答两个问题。

glBegin和glEnd之间的关系非常有限。这是有目的的,因为你把GL放在一个非常特殊的模式 - 在Draw的中间。因此,任何与每个顶点属性无直接关系的东西都是无效的。即使glGetError在该上下文中也是无效的。尝试并考虑glBegin +在+ glEnd之间的所有GL调用作为对GL的单个Draw调用,这有助于更接近GL实际上做的事情。

现在,如果你坚持使用简单的规则只调用属性方法(glNormal,glTexCoord,glColor,glSecondaryColor,glIndex,glMultiTexCoord,glVertexAttrib,glVertex,那么你应该永远不会在Begin / End对内部触发GL错误)其他几个)。其他任何东西都会触发错误。 (错误......好吧,glMaterial有点例外。它有效,但不鼓励使用它)

如果您的问题是在开始/结束对中触发错误时可以调用glGetError,那么ChrisF在注释中回答:在glEnd调用之后。

现在,从更广泛的意义上讲,仅将glGetError用作调试工具。我的个人偏见是双重的:

  • 每帧检查一次glGetError以确保没有错误
  • 使用可以检查GL错误代码的宏来包装大多数GL调用,并且只在每帧检查失败时将其打开。

当然,由于属性方法可以被称为外部一个开始/结束对,因此让它们正确起来有点棘手。但在实践中,这些方法无论如何都不会失败,所以我不打算对它们进行宏观检查。

琐事的一小部分:GL API最初的设计使得客户端实现实际上无法知道呼叫站点是否存在错误。例如。如果GL实际上是在远程机器上实现的(比如在SGI时间),那么调用一个目标不是GL_TEXTURE_ENV的glTexEnv就可以简单地添加到命令缓冲区中,并且不会在该点记录错误。

如果您随后调用glGetError,则客户端必须将命令缓冲区刷新到GL服务器,等待处理缓冲的命令,获取错误代码,并将相应的错误代码返回给应用

如果这听起来很重,那是因为它是。这就是为什么不是每个调用都返回错误代码的主要原因,顺便说一下,为什么调用glGetError只能被认为是可以用于调试目的。如今,大多数GL实现都在同一个流程中处理所有状态管理,正如我所说,对大多数用户来说,这真的是琐事。

最后,每当我谈论开始/结束时,我觉得我需要说你根本不应该使用它。这是用GL绘制最糟糕的表现方式。

答案 1 :(得分:4)

通常你应该在每隔一个glGetError调用之后调用gl...,因为调用的一个效果是清除堆栈中的错误(from the MSDN):

  

发生错误时,错误标志将设置为相应的错误代码值。在调用glGetError之前,不会记录其他错误,返回错误代码,并将标志重置为GL_NO_ERROR。

但是,如果您在glBeginglEnd之后拨打电话glError,请致电glEnd。这应该返回正确的错误代码(如果有的话)并清除错误堆栈。

答案 2 :(得分:3)

编码的一些原理要求每个程序检查每个可能的错误,并妥善处理这些错误。然而,遵循其中一个哲学需要大量额外的代码,并且可以显着减慢程序。实际上,我在诊断问题时只使用glGetError,或者编写一些很有可能失败的代码,并在错误发生后执行适当的操作。

在第一种情况下,诊断问题时,我使用两种策略中的一种。因为在调用glGetError之前OpenGL不会记录新错误,所以我可以每次通过主循环检查错误。这告诉我第一个错误,然后我跟踪,并希望修复。当我缩小到一些有问题的代码时,我使用的另一种策略,但我不确定哪个调用引起了问题。每次gl ...之后调用glBegin。 。 。 glEnd块我将调用glGetError,并报告任何错误。这将告诉我究竟哪个gl ...调用导致问题,并希望启动我的修复之路。

在第二种情况下,为可能的错误进行防御性编程,我将调用glGetError来清除错误标志,使其他gl ...调用,然后调用glGetError。然后我采取任何行动来处理任何glGetError报告。

相关问题