0

我在 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

谢谢 !

4

2 回答 2

3

我看到与 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);

如果有不清楚的地方,请在评论中提问。

于 2011-08-18T22:24:38.623 回答
2

尝试将最后一行更改为:

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

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

于 2011-08-18T08:26:07.673 回答