2011-08-18 95 views
0

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

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 

谢谢!

+0

哪个版本的OpenGL你生成你的上下文? – datenwolf

+0

对不起,这个愚蠢的问题:我怎么能找到这个? –

+0

@Laurent这取决于你的平台。你使用QGLViewer或过剩或其他?通常会提供一些开关来创建具有特定版本的上下文。 – pmr

回答

2

尝试改变最后一行:

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

除非IndexVBOID你的数据真的很短,但随后情况下,sizeof(int)的上方是错误的。

+0

感谢您的更正,但更改最后一行仍然无法正常工作。第一次运行后,没有显示任何内容,第二次后,一切都消失了。是否我应该在每个帧显示中运行所有这些命令,还是应该释放它们之间的某些内容?谢谢 ! –

+0

除非您的几何图形发生变化,否则您应该在初始化代码中将前两个段落写入一次,并在render函数中运行两次最后一段。请注意,每次调用glGenBuffers都会占用图形资源! – rodrigo

+0

好吧,我会尝试去实现这一点,看看为什么我有一些奇怪的行为(也许顶点阵列设置后刷新不好,我也会检查。谢谢! –

3

我看到了同样的问题,因为罗德里戈 - 你有数据类型不匹配,你可以在这里看到:

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]

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

如果事情还不清楚,只是要求在评论..