我正在开发一些图形应用程序,但在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)之前调用某些函数。

最佳答案

我遇到了同样的问题,并最终找出了原因:
当您在glBindFramebufferglPushAttrib(GL_COLOR_BUFFER_BIT)之间调用glPopAttrib时,在glPopAttrib调用上会导致GL_INVALID_OPERATION

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

唯一的解决方案似乎是要么避免在glPushAttrib和glPopAttrib之间进行所有glBindFramebuffer调用,要么通过手动存储和恢复所有相关的颜色缓冲区状态来避免使用glPushAttrib和glPopAttrib。

关于c++ - glPopAttrib和GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8504947/

10-13 02:06