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

23

我使用 GLEW 和 freeglut。但在调用 glewInit() 后,即使设置了 glewExperimental = GL_FALSE, glGetError() 也会返回错误代码 1280。

我无法编译着色器,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);
}

我做错了什么?


你有在处理GlewInitResult吗?也许你应该调用glewGetErrorString而不是glGetError(用于检测glew问题)。 - Tim
我对GlewInitResult没有做任何操作。glewGetErrorString返回“无错误”。 - Martin
2个回答

22

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

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

它提到了为什么会出现这种情况,并表示“在某些情况下,即使在指定glewExperimental后,根据您的glew版本,您仍可能会遇到GL_INVALID_ENUM”。

如果没有出现其他问题,听起来忽略这个警告是安全的。


我尝试注释掉这一行,但仍然出现无效枚举的错误。 我无法编译着色器,glGetProgramInfoLog() 返回“在调用 glLinkProgram() 之前,顶点着色器未能成功编译。链接失败。” - Martin
5
在尝试链接程序之前,你应该验证着色器:使用glGetShaderiv(GL_COMPILE_STATUS)和glGetShaderInfoLog()。这将告诉你它们无法编译的原因。 - Tim

-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

在其他标志之前保持环氧标志似乎很重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接