我在OpenGL中有一个VBO和一个IBO,但是无法正确地绘制它们。你能告诉我在画面显示功能中可能忘记了什么吗?
-struct Point3D是一个内部有3个浮点数(x,y,z)的结构。
-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

谢谢!

最佳答案

我看到与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规范,gldrawerElement只能使用未签名的数据类型。要解决此问题,您需要:
在声明中将VBOInd改为unsigned类型,如下所示:
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);

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

10-08 08:20
查看更多