当前位置: 首页 > 知识库问答 >
问题:

GL_在上下文初始化之后立即出现无效的_枚举

澹台岳
2023-03-14

在glew init完成之后,在调用任何其他GL命令之前调用glGetError时,我得到了GL_INVALID_ENUM代码。我正在设置OpenGL 4.2内核,向前兼容。使用GLFW作为窗口/输入,GLEW作为gl上下文,所有这些都在64位Windows 7上运行。我的图形卡是GeForce 550GT,它有OpenGL 4.2的最新驱动程序。另一件奇怪的事是,我用的是GLDrawerElements(),效果很好。但后来我尝试了glDrawArrays(),这是我完成某项特定任务所需要的,但它根本不起作用。我重新检查了所有的gl语法、缓冲区创建着色器等,什么都没有。调用glDrawArrays()时,我确实得到了GL_无效的_操作,我不知道为什么。所有这些工作都是一个迷你渲染引擎,但目前管道非常简单,所以我不明白会出现什么问题。以下是我如何初始化上下文和窗口:

 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

   }

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

GlewInit之后可能会出现GL_INVALID_ENUM,它不应该影响渲染。所以我只剩下第二个问题。。。

在用VBO调用glDrawArrays()时,我发现了GL_INVALID_ENUM的解决方法。如果我将VBO打包到VAO中,错误就会消失,渲染也可以正常工作。这是否意味着在正向兼容的核心配置文件中,我们不能直接使用VBO绘制?从未在官方文件中看到任何与之相关的东西。

共有1个答案

宰父跃
2023-03-14

顶点阵列对象在核心轮廓中不是可选的。GL_INVALID_ENUM错误可能来自其他地方;你应该得到GL\u无效\u操作。请记住:OpenGL错误是缓冲的,所以您必须继续获取GL错误,直到您返回GL_NO_ERROR

GlfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);

请停止这样做。在核心配置文件中,前向兼容性实际上毫无意义。

 类似资料:
  • 我试图在Python中初始化火花上下文变量。 但我得到了以下错误: py4j。协议Py4JJavaError:调用None时出错。组织。阿帕奇。火花应用程序编程接口。JAVAJavaSparkContext.:JAVAlang.NoClassDefFoundError:无法初始化类组织。阿帕奇。火花内部的配置。组织上的包$ 。阿帕奇。火花斯帕克孔夫。在组织上验证设置(SparkConf.scala

  • 所以我想用java编写一个Tic-Tac-Toe游戏。 现在点击一个按钮,我想把按钮的图像设置为“十字”或“圆圈”,但是一旦一个类型跟随代码,按钮就会消失,直到我悬停在它们上面,然后它们就会返回。 没有上面的代码会是什么样子 这里的项目结构

  • 我正在尝试使用spark submit server2运行spark程序。py——主本地[2]。然后我得到了这个错误: 以下是我正在运行的代码: 谁能帮我一下我做错了什么。我试过这篇文章中的解决方案无法初始化spark上下文,但它不起作用。

  • 我已经按照下面的描述设置了集群: https://spark.apache.org/docs/latest/running-on-kubernetes.html kubernetes客户端似乎无法与API通信?我想弄明白为什么。 还有什么想法可以尝试调试这个问题吗?

  • 我试图在Windows 8.1上运行Apache Spark调用Spark shell命令时,得到以下堆栈: 系统变量配置如下: HADOOP\u主页: c: \ hadoop JAVA_HOME: C: \Java\jdk1.8.0\u 162 SCALA_HOME: C: \斯卡拉 SPARK\u主页: C: \ spark\spark-2.3.0-bin-hadoop2.7 路径: %JAV