【问题标题】:Unable to display VBO in OpenGL无法在 OpenGL 中显示 VBO
【发布时间】:2011-10-29 13:51:57
【问题描述】:

我在 OpenGL 中有一个 VBO 和一个 IBO,但无法正确绘制它们。你能告诉我我在框架显示功能中忘记了什么吗? - struct Point3D 是一个在 (x,y,z) 内有 3 个浮点数的结构。 - nbVertex 是 glVertex 数组中的顶点数量。 - nbVBOInd 是 VBOInd 数组中的索引数量。

    glGenBuffers(1, &VertexVBOID);
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(struct Point3D)*nbVertex, glVertex, GL_STATIC_DRAW);

    glGenBuffers(1, &IndexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(glVertex), BUFFER_OFFSET(0));   //The starting point of the VBO, for the vertices

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   //The starting point of the IBO

谢谢!

【问题讨论】:

  • 您为哪个 OpenGL 版本生成上下文?
  • 抱歉这个愚蠢的问题:我怎样才能找到这个?
  • @Laurent 这取决于您的平台。您使用 QGLViewer 还是 glut 或其他东西?通常确实提供一些开关来创建具有特定版本的上下文。

标签: c opengl vbo vertex-buffer indices


【解决方案1】:

我看到了与 rodrigo 相同的问题 - 您的数据类型不匹配,您可以在此处看到:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

sizeof(int) - 使用整数类型

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));   

GL_UNSIGNED_SHORT - 使用短类型

根据 openGL 规范,glDrawElements 只有无符号数据类型。要解决此问题,您需要:

  • 在声明中将 VBOInd 更改为无符号类型:

    unsigned int* VBOInd = new unsigned int[nbVBOInd]

  • 将第 6 次调用替换为

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

  • 将第 11 个(最后一次)调用替换为

    glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

无论如何我认为问题隐藏在指针设置中,将第 9 次调用更改为

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

如果这不起作用,请告诉我们 glVertex 和 VBOInd 是如何声明和填充数据的。也许你正在使用 std::vector?您需要像这样调用这些数据容器:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, &VBOInd[0], GL_STATIC_DRAW);

如果有不清楚的地方,请在 cmets 中询问。

【讨论】:

    【解决方案2】:

    尝试将最后一行更改为:

    glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
    

    除非您在 IndexVBOID 中的数据真的很短,否则,上面的 sizeof(int) 将是错误的。

    【讨论】:

    • 感谢您的更正,但更改最后一行仍然无法正常工作。第一次运行后,什么都没有显示,第二次之后,一切都消失了。我是否应该在每个帧显示时运行所有这些命令,还是应该在两者之间释放一些东西?谢谢!
    • 除非你的几何结构发生变化,你应该在初始化代码中编写前两段一次,只运行一次,最后两段在渲染函数中。请注意,每次调用 glGenBuffers 都会消耗图形资源!
    • 好的,我会尝试优化这个,看看为什么我有一些奇怪的行为(也许刷新后顶点数组设置错误,我也会检查一下。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多