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, сохраняя и восстанавливая все соответствующие состояния буфера цвета вручную.