2016-04-23 174 views
-1

我在opengl中创建了一个网格,非常简单,但当我调用gl :: GenVertexArrays时出现错误。以下是代码。我正在使用glfw3。OpenGL与GenVertexArrays无效操作

GLuint vao = 0; 
check_gl_error(); 
gl::GenVertexArrays(1, &vao); 
check_gl_error(); //the error is caught here and its a INVALID_OPERATION 
gl::BindVertexArray(vao); 
check_gl_error(); 

我没有太多的经验与OpenGL的,但是我已经使用OpenGL的使用GLFW在同一台计算机上,并曾与GenVertexArrays合作项目。

编辑:

我的计划是建立与

if (!glfwInit()) { 
    std::cout << "Init GLFW failed" << std::endl; 
    exit(EXIT_FAILURE); 
} 

GLFWwindow* window = glfwCreateWindow(800, 800, "My Title", NULL, NULL); //glfwGetPrimaryMonitor() full screen 
if (!window) { 
    std::cout << "Init window failed" << std::endl; 
    glfwTerminate(); 
    exit(EXIT_FAILURE); 
} 
gl::sys::LoadFunctions(); 

//check_gl_error(); 

glfwMakeContextCurrent(window); 
check_gl_error(); 

glfwSwapInterval(1); 
check_gl_error(); 

GLuint programID = gl::CreateProgram(); 
+0

不要在任何地方向'check_gl_error'发送垃圾邮件,您应该使用glfw提示设置一个调试上下文。您需要设置错误回调,错误会自动调用错误回调。你是否使上下文最新? – doug65536

+0

[这是OpenGL 1.1的核心部分](https://www.opengl.org/registry/specs/ARB/debug_output.txt)。它几乎可以肯定是可用的,并且让驾驶员快速准确地验证事情并发现错误是非常有用的。 – doug65536

+0

@ doug65536我确实使上下文与glfwMakeContextCurrent(window);.它就像我程序中的第十行代码,发生在我上面发布的代码之前。 – dan

回答

1

你使用GLEW或glLoadGen什么?你需要告诉它在之后再次更新它的入口点你使实际上下文成为当前。

在Windows中,只有古老的OpenGL才可用,直到您制作出更现代的上下文为止。只有这样才能通过GLEW/glLoadGen的代码查找更高版本的入口点。

换句话说,所有这些OpenGL函数指针突然都可能指向不同的代码,因为OpenGL版本发生了变化。这就是wgl的工作原理。