2014-02-11 54 views
1

我有我的代码有问题:(OpenGL的4.1核心语境下,我使用VertexArrayObjects)glVertexAttribPointer(偏移?)给GL_INVALID_OPERATION

//This is a member method, vertexArrayObject and vertexBufferObject are of course generated using glGenVertexArrays & glGenBuffers 
glBindVertexArray(vertexArrayObject); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, 0); 
Draw::debugLogGLError(); // OpenGL Error #0 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 3)); 
Draw::debugLogGLError(); // OpenGL Error #1282 
glEnableVertexAttribArray(2); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 6)); 
Draw::debugLogGLError(); // OpenGL Error #1282 
glBindVertexArray(0); 

抽奖:: debugLogGLError()简单地打印出最新的错误代码到控制台

void Draw::debugLogGLError(void){ 
    std::cout << "OpenGL Error #" << glGetError() << std::endl; 
} 

如果我删除了偏移​​它将运行得很好。 所以我假设这是(void*)有问题。然而,在我开始在课堂上实施这个之前,它工作得很好。 我可能会错过一些代码

OS:小牛,HD5000,锵编译器在Xcode

+0

这似乎是正确的,唯一不同于我的代码的是:我不会在任何地方调用'glBindVertexArray',我只是装入我的顶点缓冲区,并且在'glVertexAttribPointer'后面调用'glEnableVertexAttribArray'。 –

+0

嗯。仍然获得'GL_INVALID_OPERATION'。我读过使用核心上下文时必须实现顶点数组对象 – Phlenum

+0

您可以发布顶点缓冲区的初始化代码吗? –

回答

1

根据http://www.opengl.org/wiki/GLAPI/glVertexAttribPointer

GL_INVALID_OPERATION​ is generated if size​ is GL_BGRA​ and type​ is not GL_UNSIGNED_BYTE​, GL_INT_2_10_10_10_REV​ or GL_UNSIGNED_INT_2_10_10_10_REV​. 
GL_INVALID_OPERATION​ is generated if type​ is GL_INT_2_10_10_10_REV​ or GL_UNSIGNED_INT_2_10_10_10_REV​ and size​ is not 4 or GL_BGRA​. 
GL_INVALID_OPERATION​ is generated if type​ is GL_UNSIGNED_INT_10F_11F_11F_REV​ and size​ is not 3. 
GL_INVALID_OPERATION​ is generated by glVertexAttribPointer if size​ is GL_BGRA​ and noramlized​ is GL_FALSE​. 
GL_INVALID_OPERATION​ is generated if zero is bound to the GL_ARRAY_BUFFER​ buffer object binding point and the pointer​ argument is not NULL​. 
GL_INVALID_OPERATION​ is generated if no vertex array object is bound. 

前4显然不是这样的,所以必须是一个最后一个2.最后一个不能这样,因为它不总是抛出错误,最后一个会抛出错误。因此,根据维基的问题是:

GL_INVALID_OPERATION​ is generated if zero is bound to the GL_ARRAY_BUFFER​ buffer object binding point and the pointer​ argument is not NULL​. 

这意味着vertexBufferObject在你的代码是0,因此不是一个有效的缓冲对象。如果情况并非如此,我想你只是偶然发现了一个重大的驱动程序错误。

+0

谢谢!我刚刚查看了我的代码,发现'vertexBufferObject'为0.一个令人尴尬的错误... – Phlenum