недопустимая операция на glEnd без причины?

Я работал над программой GL в течение некоторого времени, и вдруг она стала давать ошибки.
Попытавшись разрешить их некоторое время, я написал короткую тестовую программу, которая генерирует такое же поведение:

#include <GL/glut.h>
#include <iostream>

#define CHECK_GL_ERR() printError(__LINE__)

void printError(int line)
{
GLenum err = glGetError();
if(err != GL_NO_ERROR)
{
std::cerr << "GL error on line " << line << ": " << gluErrorString(err) << std::endl;
}
}

void displayFunc()
{
CHECK_GL_ERR();
glBegin(GL_POINTS);
CHECK_GL_ERR();
glVertex3f(0, 0, 0);
CHECK_GL_ERR();
glEnd();
CHECK_GL_ERR(); //line 23
exit(0);
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitWindowSize(300, 300);
glutCreateWindow("Test");

glutDisplayFunc(displayFunc);

glutMainLoop();
}

Когда я запускаю эту программу, она выдает:

GL error on line 23: invalid operation

Так что кажется, что glEnd(); вызывает ошибку.
Документы говорят:

GL_INVALID_OPERATION генерируется, если glEnd выполняется без
предшествует glBegin.

Что не так в моем коде. Так кто-нибудь видит, почему этот код выдает сообщение об ошибке?

PS: Конечно, я знаю, что glBegin / End давно устарел / удален, но очень удобно собирать вместе небольшие куски кода. Также программа работала без ошибок, пока GL не решил быть сварливым.

РЕДАКТИРОВАТЬ

Я только что сделал трассировку с glslDevil, которая дала:

W! Program Start
|  glXQueryExtension(0x1ab03f0, (nil), (nil))
|  glXChooseFBConfig(0x1ab03f0, 0, 0x7fffb8fcf8b0, 0x7fffb8fcf8a4)
|  glXGetVisualFromFBConfig(0x1ab03f0, 0x111)
|  glXGetProcAddressARB(0x7f93c37526e5)
|  glXCreateNewContext(0x1ab03f0, 0x111, 32788, (nil), 1)
|  glXIsDirect(0x1ab03f0, 0x1ac8de8)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glDrawBuffer(GL_FRONT)
|  glReadBuffer(GL_FRONT)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glViewport(0, 0, 300, 300)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glGetError()
|  glBegin(GL_POINTS)
|  glGetError()
|  glVertex3f(0,000000, 0,000000, 0,000000)
|  glGetError()
|  glEnd()
W! OpenGL error GL_INVALID_OPERATION detected
|  glGetError()
|  glXMakeContextCurrent(0x1ab03f0, 123731970, 123731970, 0x1ac8de8)
|  glXDestroyContext(0x1ab03f0, 0x1ac8de8)
E! Child process exited
W! Program termination forced!

9

Решение

После некоторого тестирования я обнаружил, что у вашей программы есть две простые проблемы:

  1. Вы не должны использовать glGetError внутри блока glBegin / glEnd. API строго по этому поводу. Но ошибка только случается после glEnd. Если вы прочитаете API, вы обнаружите, что ошибка может распространяться: это происходит только после glEnd.
  2. Ошибка сегментации возникает при использовании exit (0) внутри функция отображения (это происходит только с драйвером Intel.) Это происходит из-за того, что контекст GL еще не освобожден и возникает ошибка драйвера. Поэтому вам следует избегать выхода из функции дисплея.
13

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector