我在glew init完成之后和调用任何其他gl命令之前调用glGetError时得到GL_INVALID_ENUM代码。我正在设置OpenGL 4.2 CORE,转发兼容。使用GLFW进行窗口/输入,GLEW用于gl上下文所有这些运行在Windows 7 64bit.My显卡是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之后发生,并且它不应该拧动渲染。所以我留下了第二个问题......
我在用VBO调用glDrawArrays()时找到了GL_INVALID_ENUM的解决方法。如果我将VBO打包到VAO中错误消失了,我得到渲染工作。这意味着在前向兼容核心配置文件中我们无法使用VBO绘制直接?在官方文档中从未见过任何与之相关的内容。
答案 0 :(得分:5)
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。