glPopAttrib& GL_INVALID_OPERATION

时间:2011-12-14 13:03:49

标签: c++ windows opengl

我正在处理一些图形应用程序,GL_INVALID_OPERATION之后我得到glPopAttrib()。预测答案“您似乎在glPopAttrib()区块内呼叫glBegin/glEnd”,请参阅我使用GLIntercept制作的此日志。

/* tons of wglGetProcAddress* */
wglGetProcAddress("glEndOcclusionQueryNV")=087C9B10 
wglGetProcAddress("glBeginTransformFeedbackN...")=087C9ED0 
wglGetProcAddress("glEndTransformFeedbackNV")=087C9F00 
glPushAttrib(GL_VIEWPORT_BIT)
glPushAttrib(GL_COLOR_BUFFER_BIT)
glPushAttrib(GL_COLOR_BUFFER_BIT)
glPopAttrib()
glPopAttrib() glGetError() = GL_INVALID_OPERATION # <---- THIS
glPopAttrib()
glPushAttrib(GL_VIEWPORT_BIT)
glPushAttrib(GL_COLOR_BUFFER_BIT)
glPushAttrib(GL_COLOR_BUFFER_BIT)
glPopAttrib()
glPushAttrib(GL_POINT_BIT | GL_LINE_BIT | GL_COLOR_BUFFER_BIT)
glPopAttrib()
glPopAttrib()
glPopAttrib()
glPushAttrib(GL_VIEWPORT_BIT)
glPushAttrib(GL_COLOR_BUFFER_BIT)
glPushAttrib(GL_COLOR_BUFFER_BIT)
glPopAttrib()
glPopAttrib()
glPopAttrib()
/* and so on */

在导致错误glBegin/glEnd之前未进行glPopAttrib()次调用。 (I用于FINDSTR commad过滤日志)。

错误仅出现一次,在代码执行期间不再出现此类(或其他)错误。我怀疑我应该在glPushAttrib(GL_VIEWPORT_BIT)之前调用一些函数。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,最后想出了原因: 当您在glBindFramebufferglPushAttrib(GL_COLOR_BUFFER_BIT)之间拨打glPopAttrib时,会在glPopAttrib呼叫上导致GL_INVALID_OPERATION

在调用glPopAttrib之前恢复原始帧缓冲区绑定时甚至会发生这种情况。

唯一的解决办法似乎是避免glPushAttrib和glPopAttrib之间的所有glBindFramebuffer调用,或者通过手动存储和恢复所有相关的颜色缓冲区状态来避免使用glPushAttrib和glPopAttrib。

答案 1 :(得分:2)

有趣的问题。让我思考..

当从窗口系统获取OpenGL上下文时,可能发生的一些与COLOR_BUFFER_BIT关联的状态变量未使用适当的值进行初始化。当您执行glPushAttrib时,保存了那些(可能)不正确的值,并且当弹出attrib时,恢复了错误的值 - 导致无效操作?这听起来合乎逻辑吗?