glPopAttrib & GL_INVALID_OPERATION - PullRequest
       2

glPopAttrib & GL_INVALID_OPERATION

10 голосов
/ 14 декабря 2011

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

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

Ответы [ 2 ]

3 голосов
/ 28 сентября 2015

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

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

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

2 голосов
/ 16 декабря 2011

Интересная проблема. Заставил меня задуматься ..

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...