OpenGL: glGetError() 在调用 glewInit() 后返回无效的枚举

OpenGL: glGetError() returns invalid enum after call to glewInit()

本文关键字:返回 无效 枚举 调用 glGetError OpenGL glewInit      更新时间:2023-10-16

我使用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: %sn", 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);
}

我做错了什么?

你看到这个维基页面上的评论了吗?

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

它提到了为什么会发生这种情况,并说"在某些情况下,根据你的glew版本,在指定glewExperiment后,你仍然可能会得到GL_INVALID_ENUM"。

听起来只要您没有看到任何其他问题,就可以安全地忽略它。

似乎 glew 只是无法正常工作...对我来说,最简单的解决方案是使用利普西。它不需要任何初始化的东西。只需更换您的

#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

环氧标志放在其他人之前似乎很重要。