OpenGL: glGetError() возвращает недействительное перечисление после вызова glewInit()

Я использую GLEW и Freeglut. По какой-то причине после вызова glewInit () glGetError() возвращает код ошибки 1280, даже с glewExperimental = GL_FALSE.

Я не могу скомпилировать шейдеры, glGetProgramInfoLog() возвращает "Вершинные шейдеры не были успешно скомпилированы до вызова 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);
}

Что я делаю не так?

2 ответа

Решение

Вы видели комментарий на этой вики-странице?

http://www.opengl.org/wiki/OpenGL_Loading_Library

В нем упоминается, почему это происходит, и в нем говорится, что "в некоторых случаях вы все равно можете получить GL_INVALID_ENUM после указания glewExperimental в зависимости от вашей версии 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

Кажется, важно сохранить флаг эпоксидной смолы перед другими.

Другие вопросы по тегам