#c #opengl #sdl #glsl
#c #opengl #sdl #glsl
Вопрос:
Я получаю ошибку «недопустимая операция» при попытке использовать glUseProgramObjectARB
и я понятия не имею, почему.
Я абсолютно уверен, что шейдерные программы загружаются правильно. Это показано на glGetInfoLogARB
:
- Вершинный шейдер был успешно скомпилирован для запуска на оборудовании.
- Фрагмент шейдера был успешно скомпилирован для запуска на этом оборудовании.
До этой команды не было предыдущих ошибок OpenGL. Таким образом, что-то с этой конкретной командой определенно является проблемой.
Я использую glew с SDL. Я использовал GLee раньше и сталкивался с той же проблемой.
Читая документацию, я предполагаю, что это ошибка:
GL_INVALID_OPERATION генерируется, если программу не удалось сделать частью текущего состояния.
но я не уверен точно, что могло вызвать такую вещь. Команда выдается в рабочем контексте OpenGL, поскольку все предыдущие команды шейдера работают нормально. Это не находится между блоками «begin» и «end».
На самом деле я в тупике относительно того, что это может означать. Возможно, существует какой-то более конкретный случай, когда команда не может быть выдана. Если кто-нибудь знает что-нибудь еще, это было бы здорово.
Редактировать:
Решаемая: о Боже, это было запоздало, я пропускал возврат при одном из моих вызовов функции в другом месте и поэтому не передавал обратно созданную мной программу.
Комментарии:
1. Я вижу, что ваши информационные журналы в порядке, но действительно ли объекты / программа правильно скомпилированы / связаны? (glGetObjectiv(GL_COMPILE_STATUS), glGetProgramiv(GL_LINK_STATUS)). Я знаю некоторые сценарии, когда программе не удается установить связь, несмотря на тот же «хороший» информационный журнал, который она выдает.
Ответ №1:
Не видя вашего кода, это трудно определить, но поскольку вы явно указываете результаты glCompileShaderARB
(раз два), но не glLinkProgramARB
я догадаюсь, что вы забыли glLinkProgramARB
(после чего, кстати, вы можете безопасно glDeleteObjectARB
использовать два шейдерных объекта).
Комментарии:
1. Спасибо за ответ. Я связал программу без проблем, хотя не знал, что смогу удалить шейдерные объекты после связывания. Код сложно вставить, поскольку он достаточно инкапсулирован в некоторые дополнительные объекты, но вот вкратце, что я выполняю: pastebin.com/w9G1KiWd