GlPopAttrib & GL_INVALID_OPERATION

Я работаю над некоторым графическим приложением, а после glPopAttrib() получил GL_INVALID_OPERATION. Предсказание ответа "Кажется, вы вызываете 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(). (Я использовал findstr commad для фильтрации журнала).

Ошибка появляется только один раз, во время выполнения кода не появляется такая (или другая) ошибка. У меня есть подозрение, что я должен вызвать некоторую функцию до glPushAttrib(GL_VIEWPORT_BIT) или что-то еще.

Ответ 1

Интересная проблема. Я подумал.

Что может случиться, так это то, что некоторые из переменных состояния, связанных с COLOR_BUFFER_BIT, не были инициализированы соответствующими значениями, когда контекст OpenGL был получен из оконной системы. Когда вы выполнили glPushAttrib, те (возможно) неправильные значения были сохранены, и когда атрибут был высколден, неправильные значения были восстановлены - что привело к недействительной операции? Это звучит логично?

Ответ 2

У меня была та же проблема и, наконец, выяснил причину: Когда вы вызываете glBindFramebuffer между glPushAttrib(GL_COLOR_BUFFER_BIT) и a glPopAttrib, при вызове glPopAttrib вызывается GL_INVALID_OPERATION.

Это происходит даже при восстановлении привязки исходного буфера кадра до вызова glPopAttrib.

Единственное решение, похоже, либо избегает всех вызовов glBindFramebuffer между glPushAttrib и glPopAttrib, либо не использует glPushAttrib и glPopAttrib, сохраняя и восстанавливая все соответствующие состояния буфера цвета вручную.