C 无法在OpenGL中显示VBO

C 无法在OpenGL中显示VBO,c,opengl,vbo,vertex-buffer,indices,C,Opengl,Vbo,Vertex Buffer,Indices,我在OpenGL中有一个VBO和一个IBO,但无法正确地绘制它们。你能告诉我框架显示功能中我可能忘记了什么吗? -struct Point3D是一个内部有3个浮动(x、y、z)的结构。 -nbVertex是glVertex数组中的顶点数。 -nbVBOInd是VBOInd数组中的索引量 glGenBuffers(1, &VertexVBOID); glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); glBufferData(GL

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

谢谢

尝试将最后一行更改为:

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

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

尝试将最后一行更改为:

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

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

我看到了与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-使用SHORT类型

根据openGL规范,GLD元素只能使用未签名的数据类型。要解决此问题,您需要:

  • 在声明中将VBOInd更改为无符号类型,如下所示:

    unsigned int*VBOInd=新的unsigned int[nbVBOInd]

  • 将第6次呼叫替换为

    glBufferData(GL\u元素\u数组\u缓冲区,sizeof(unsigned int)*nbVBOInd,VBOInd,GL\u静态\u绘图)

  • 将第11次(最后一次)呼叫替换为

    glpaurements(GL_三角形、nbVBOInd、GL_无符号INT、BUFFER_偏移量(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);

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

我看到了与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-使用SHORT类型

根据openGL规范,GLD元素只能使用未签名的数据类型。要解决此问题,您需要:

  • 在声明中将VBOInd更改为无符号类型,如下所示:

    unsigned int*VBOInd=新的unsigned int[nbVBOInd]

  • 将第6次呼叫替换为

    glBufferData(GL\u元素\u数组\u缓冲区,sizeof(unsigned int)*nbVBOInd,VBOInd,GL\u静态\u绘图)

  • 将第11次(最后一次)呼叫替换为

    glpaurements(GL_三角形、nbVBOInd、GL_无符号INT、BUFFER_偏移量(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);

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

谢谢您的更正,但更改最后一行仍然无法正常工作。第一次运行后,将不显示任何内容,第二次运行后,所有内容都将消失。我应该在每个帧显示时运行所有这些命令,还是应该在其间释放一些东西?谢谢除非几何体发生更改,否则应在初始化代码中编写前两段代码,以便只运行一次,并在渲染函数中编写最后两段代码。请注意,每次调用glGenBuffers都会占用图形资源!好的,我会尝试优化这个,看看为什么我会有一些奇怪的行为(可能顶点数组在刷新后设置得不好,我也会检查一下。谢谢!谢谢你的更正,但更改最后一行仍然不能正常工作。第一次运行后,什么都不显示,第二次运行后,所有内容都消失了。我是否真的应该在每个帧显示时运行所有这些命令,或者我应该在两者之间释放一些东西吗?谢谢!除非您的几何体发生变化,否则您应该在初始化代码中编写前两段代码,只运行一次,并在渲染函数中编写最后两段代码。请注意,每次调用glGenBuffers都会占用图形资源!好的,我将尝试对其进行优化,看看为什么我会有一些奇怪的行为(可能顶点数组在一些刷新后设置得不好,我也会检查一下。谢谢!您为哪个OpenGL版本生成上下文?很抱歉问了一个愚蠢的问题:我怎么才能找到这个问题?@Laurent,这取决于您的平台。您是否使用QGLViewer或glut或其他东西?通常会提供一些开关来创建带有s的上下文特定版本。您为哪个OpenGL版本生成上下文?很抱歉问了一个愚蠢的问题:我如何才能找到它?@Laurent,这取决于您的平台。您是否使用QGLViewer或glut或其他工具?通常会提供一些开关来创建具有特定版本的上下文。