我正在处理一些图形应用程序,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)
之前调用一些函数。
答案 0 :(得分:3)
我遇到了同样的问题,最后想出了原因:
当您在glBindFramebuffer
和glPushAttrib(GL_COLOR_BUFFER_BIT)
之间拨打glPopAttrib
时,会在glPopAttrib呼叫上导致GL_INVALID_OPERATION
。
在调用glPopAttrib之前恢复原始帧缓冲区绑定时甚至会发生这种情况。
唯一的解决办法似乎是避免glPushAttrib和glPopAttrib之间的所有glBindFramebuffer调用,或者通过手动存储和恢复所有相关的颜色缓冲区状态来避免使用glPushAttrib和glPopAttrib。
答案 1 :(得分:2)
有趣的问题。让我思考..
当从窗口系统获取OpenGL上下文时,可能发生的一些与COLOR_BUFFER_BIT
关联的状态变量未使用适当的值进行初始化。当您执行glPushAttrib
时,保存了那些(可能)不正确的值,并且当弹出attrib时,恢复了错误的值 - 导致无效操作?这听起来合乎逻辑吗?