【问题标题】:GL_INVALID_ENUM right after context initializationGL_INVALID_ENUM 在上下文初始化之后
【发布时间】:2012-12-02 08:38:27
【问题描述】:

在 glew init 完成后和调用任何其他 gl 命令之前调用 glGetError 时,我得到 GL_INVALID_ENUM 代码。我正在设置 OpenGL 4.2 CORE,向前兼容。将 GLFW 用于窗口/输入,将 GLEW 用于 gl 上下文所有这些运行在 Windows 7 64 位上。我的显卡是 GeForce 550GT,它具有 OpenGL 4.2 的最新驱动程序。另一个奇怪的事情是我使用的 glDrawElements() 工作正常。但后来我尝试了 glDrawArrays(),我需要它来完成一些特定的任务,它根本不起作用。我再次检查了所有 gl 语法,缓冲区创建着色器等。没有。调用 glDrawArrays() 时我确实得到 GL_INVALID_OPERATION,我不知道为什么。所有这些工作都是一个迷你渲染引擎,但是目前管道非常简单,所以我无法理解可能是什么问题。这是我初始化上下文和窗口的方式:

 void Engine::InitWithGLFW(){


    if(!glfwInit()){
        exit(EXIT_FAILURE);
    }
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 4);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
    glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
    glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwOpenWindowHint(GLFW_FSAA_SAMPLES,0);
    glfwDisable( GLFW_AUTO_POLL_EVENTS );

 #ifdef DEBUG
    glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
 #endif

    if(!glfwOpenWindow(_width,_height,8, 8, 8, 8, 24, 8,GLFW_WINDOW)){
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwSetWindowTitle("XDEngine V-1.0");
    InitGlew();



}

void  Engine::InitGlew(){
    glewExperimental=GL_TRUE;
    GLenum err = glewInit(); 

    if (GLEW_OK != err)
    {
        /* Problem: glewInit failed, something is seriously wrong. */
        fprintf(stderr, "Error: %s\n", glewGetErrorString(err));

    }

    fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));

    glEnable(GL_MULTISAMPLE);
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_DEPTH_TEST);
    glDepthMask(true);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0f, 1.0f);
    glEnable(GL_DEPTH_CLAMP);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glfwSetWindowSizeCallback(Reshape);
}

这是 glDrawArrays() 的渲染循环:

     void Draw(){
            _material->Draw();///activate shader program
            glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
            _material->PostDraw();  //deactivate shader program

   }

正如我所说,所有的缓冲区和着色器程序都已初始化。 更新: 好的,我在第一期找到了the answer

似乎 GL_INVALID_ENUM 可能发生在 GlewInit 之后,它不应该破坏渲染。所以我剩下第二个问题......

更新1:

当使用 VBO 调用 glDrawArrays() 时,我找到了 GL_INVALID_ENUM 的解决方法。如果我将 VBO 打包到 VAO 中,错误就会消失,并且我可以进行渲染。这是否意味着在前向兼容的核心配置文件中我们无法使用 VBO 进行绘制直接?从未在官方文档中看到过任何相关的内容。

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    Vertex array objects are not optional 在核心配置文件中。 GL_INVALID_ENUM 错误可能来自其他地方;你应该得到GL_INVALID_OPERATION。请记住:OpenGL 错误会被缓冲,因此您必须不断获取 GL 错误,直到您返回 GL_NO_ERROR

    glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);

    请停止这样做。前向兼容性是核心配置文件中的virtually meaningless

    【讨论】:

    • “顶点数组对象在核心配置文件中不是可选的”——这就是我想听到的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多