gpt4 book ai didi

c++ - 上下文初始化后 GL_INVALID_ENUM

转载 作者:太空狗 更新时间:2023-10-29 20:44:08 26 4
gpt4 key购买 nike

在 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 绘制直接?从来没有在官方文档中看到任何与之相关的内容。

最佳答案

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在核心配置文件中。

关于c++ - 上下文初始化后 GL_INVALID_ENUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13667718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com