glBindFramebuffer вызывает ошибку GL «недопустимая операция» при использовании цели GL_DRAW_FRAMEBUFFER

#c #opengl #opengl-3

#c #opengl #opengl-3

Вопрос:

Я использую OpenGL 3.3 на GeForce 9800 GTX. На справочных страницах для 3.3 говорится, что недопустимая операция с glBindFramebuffer указывает идентификатор фреймбуфера, который не был возвращен из glGenFramebuffers. Тем не менее, я вывожу идентификатор, возвращаемый glGenFramebuffers, и идентификатор, который я отправляю позже в glBindFramebuffer, и они совпадают.

Однако ошибка GL исчезает, когда я меняю целевой параметр в glBindFramebuffer с GL_DRAW_FRAMEBUFFER на GL_FRAMEBUFFER. В документации говорится, что я должен иметь возможность использовать GL_DRAW_FRAMEBUFFER. Есть ли какой-либо случай, когда вы не можете выполнить привязку к GL_DRAW_FRAMEBUFFER? Есть ли какой-либо вред от использования GL_FRAMEBUFFER вместо GL_DRAW_FRAMEBUFFER? Является ли это признаком более серьезной проблемы?

Ответ №1:

Если glBindFramebuffer(GL_FRAMEBUFFER) работает, когда glBindFramebuffer(GL_DRAW_FRAMEBUFFER) не работает, и мы не говорим о EXT-версии этих функций и перечислений (обратите внимание на отсутствие суффиксов «EXT»), то вполне вероятно, что вы, возможно, сделали что-то не так. GL_INVALID_OPERATION — это ошибка, которую вы получаете, когда несколько комбинаций параметров, зависящих от разных состояний, конфликтуют. Если бы это было просто отсутствующее перечисление, вы должны получить GL_INVALID_ENUM .

Конечно, это может быть просто ошибка драйвера. Но невозможно узнать, не зная, как выглядит ваш код.

Комментарии:

1. Программа была написана для OpenGL 2.2. Если я использую glut, могу ли я предположить, что, поскольку glGetString(GL_VERSION) сообщает мне 3.3, что контекст, который я использую, равен 3.3? Другими словами, программа может использовать внешнюю версию фреймбуферов.

2. @Phineas: нет OpenGL 2.2. Есть 2.1 и 3.2, но не 2.2.