【问题标题】:glVertexAttribPointer (Offset?) giving GL_INVALID_OPERATIONglVertexAttribPointer (Offset?) 给出 GL_INVALID_OPERATION
【发布时间】:2014-02-11 20:54:46
【问题描述】:

我的代码有问题:(OpenGL 4.1 Core Context,我正在使用 VertexArrayObjects)

//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);

Draw::debugLogGLError() 只是将最新的错误代码打印到控制台

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

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

操作系统:Mavericks、HD5000、Xcode 中的 Clang 编译器

【问题讨论】:

  • 这似乎是正确的,唯一与我的代码不同的是:我不在任何地方调用glBindVertexArray,我只是将我的顶点缓冲区装箱并在glVertexAttribPointer 之后调用glEnableVertexAttribArray .
  • 嗯。仍然收到GL_INVALID_OPERATION。我在使用核心上下文时读过必须实现顶点数组对象
  • 你能贴出你的顶点缓冲区的初始化代码吗?

标签: c++ opengl void-pointers


【解决方案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 个之一。最后一个不可能是这种情况,因为它并不总是抛出错误,而最后一个会。所以根据wiki的问题是:

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,因此不是有效的缓冲区对象。如果不是这种情况,我认为您只是偶然发现了一个主要的驱动程序错误。

【讨论】:

  • 谢谢!我刚刚查看了我的代码,发现vertexBufferObject 是 0。一个令人尴尬的错误......
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多