glPopAttrib和GL_INVALID_OPERATION

fog*_*bit 10 c++ windows opengl

我正在研究一些图形应用程序,我得到了一个GL_INVALID_OPERATIONglPopAttrib().预测答案"看起来你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 */
Run Code Online (Sandbox Code Playgroud)

glBegin/glEnd在导致错误之前不会进行任何调用glPopAttrib().(我使用findstr commad来过滤日志).

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

she*_*har 2

有趣的问题。让我想到..

COLOR_BUFFER_BIT可能发生的情况是,当从窗口系统获取 OpenGL 上下文时,与 相关的一些状态变量没有用正确的值进行初始化。当您执行 a 时glPushAttrib,那些(可能)不正确的值被保存,当属性被弹出时,不正确的值被恢复 - 导致无效操作?这听起来符合逻辑吗?