上下文初始化后立即GL_INVALID_ENUM

Mic*_* IV 3 c++ opengl

我在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);
}
Run Code Online (Sandbox Code Playgroud)

这是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

   }
Run Code Online (Sandbox Code Playgroud)

正如我所说,所有缓冲区和着色器程序都已初始化.更新:好的,我找到了第一个问题的答案:

似乎GL_INVALID_ENUM可能发生在GlewInit之后,并且它不应该拧动渲染.所以我留下了第二个问题......

UPDATE1:

当我用VBO调用glDrawArrays()时,我找到了GL_INVALID_ENUM的解决方法.如果我将VBO打包到VAO中错误消失了,我得到渲染工作.这是否意味着在前向兼容核心配置文件中我们无法直接使用VBO绘制?从不看到官方文档中与之相关的任何内容.

Nic*_*las 5

核心配置文件中的顶点数组对象不是可选的.该GL_INVALID_ENUM错误可能是从别的地方来; 你应该得到GL_INVALID_OPERATION.请记住:OpenGL错误是缓冲的,因此您必须继续获取GL错误,直到您再次使用GL_NO_ERROR.

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);

请停止这样做.在核心配置文件中,向前兼容性几乎毫无意义.