OpenGL: glGetError() возвращает недопустимое перечисление после вызова glewInit()
Я использую GLEW и freeglut. По какой-то причине после вызова функции glewInit() glGetError() возвращает код ошибки 1280, даже с glewExperimental = GL_FALSE.
Я не могу скомпилировать шейдеры, glGetProgramInfoLog() возвращает "Vertex shader (s)) не были успешно скомпилированы до вызова glLinkProgram(). Ошибка связи." Мне удалось скомпилировать шейдеры раньше.
Повторная установка драйверов не помогла.
Здесь мой код:
int main(int argc, char* argv[])
{
GLenum GlewInitResult, res;
InitWindow(argc, argv);
res = glGetError(); // res = 0
glewExperimental = GL_TRUE;
GlewInitResult = glewInit();
fprintf(stdout, "ERROR: %s\n", glewGetErrorString(GlewInitResult)); // "No error"
res = glGetError(); // res = 1280
glutMainLoop();
exit(EXIT_SUCCESS);
}
void InitWindow(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitContextVersion(4, 0);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
GLUT_ACTION_GLUTMAINLOOP_RETURNS);
glutInitWindowPosition(0, 0);
glutInitWindowSize(CurrentWidth, CurrentHeight);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
WindowHandle = glutCreateWindow(WINDOW_TITLE);
GLenum errorCheckValue = glGetError();
if (WindowHandle < 1)
{
fprintf(stderr, "ERROR: Could not create new rendering window.\n");
exit(EXIT_FAILURE);
}
glutReshapeFunc(ResizeFunction);
glutDisplayFunc(RenderFunction);
glutIdleFunc(IdleFunction);
glutTimerFunc(0, TimerFunction, 0);
glutCloseFunc(Cleanup);
glutKeyboardFunc(KeyboardFunction);
}
Что я делаю неправильно?
Ответы
Ответ 1
Вы видели комментарий на этой вики-странице?
http://www.opengl.org/wiki/OpenGL_Loading_Library
В нем упоминается, почему это происходит, и в нем говорится: "В некоторых случаях вы можете получить GL_INVALID_ENUM после указания glewExperimental в зависимости от вашей версии glew".
Похоже, что можно было бы игнорировать, если вы не видите никаких других проблем.
Ответ 2
Кажется, glew просто не работает правильно... Самое легкое решение для меня - использование libepoxy. Это не требует никакой вещи. Просто замените
#include <GL/glew.h>
с
#include <epoxy/gl.h>
#include <epoxy/glx.h>
и удалите весь код glew. Если вы используете gcc, вам также придется заменить "-lGLEW" на "-lepoxy". Это. Например, у меня есть что-то вроде:
g++ main.cpp -lepoxy -lSDL2 -lSDL2_image -lSDL2_mixer -lglut -lGLU -o main
Кажется, важно сохранить флаг эпоксидной смолы перед другими.