【问题标题】:OpenGL VBO not working (C++)OpenGL VBO 不工作(C++)
【发布时间】:2014-05-19 14:15:37
【问题描述】:

当我尝试使用 VBO + 索引绘制三角形时,它不起作用

   vertices.push_back(0.5f);
   vertices.push_back(-0.5f);
   vertices.push_back(-2.0f);
   vertices.push_back(-0.5f);
   vertices.push_back(-0.5f);
   vertices.push_back(-2.0f);
   vertices.push_back(0.5f);
   vertices.push_back(-0.5f);
   vertices.push_back(-2.0f);

   indices.push_back(0);
   indices.push_back(1);
   indices.push_back(2);


   GLuint bufferID,bufferID2;

   glGenBuffers(1,&bufferID);
   glGenBuffers(1,&bufferID2);
   glBindBuffer(GL_ARRAY_BUFFER,bufferID);
   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,bufferID2);
   glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*3,&vertices[0],GL_STATIC_DRAW);

   glEnableClientState(GL_VERTEX_ARRAY);

   glVertexPointer(3,GL_FLOAT,0,0);
   glDrawElements(GL_TRIANGLES,indices.size(),GL_UNSIGNED_INT,&indices[0]);

   glDisableClientState(GL_VERTEX_ARRAY);

   glDeleteBuffers(1,&bufferID);
   glDeleteBuffers(1,&bufferID2);

但是用 VBO 画一个点就可以了

vertices.push_back(0.5f);
vertices.push_back(-0.5f);
vertices.push_back(-2.0f);

GLuint bufferID;

glGenBuffers(1,&bufferID);
glBindBuffer(GL_ARRAY_BUFFER,bufferID);
glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*3,&vertices[0],GL_STATIC_DRAW);



glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,0);

glPointSize(100.0f);
glDrawArrays(GL_POINTS,0,1);
glDisableClientState(GL_VERTEX_ARRAY);

glDeleteBuffers(1,&bufferID);

我已经阅读了一些教程和其他帖子,但没有任何效果。 mby 我没有正确使用索引?

谁能帮我解决这个问题?

【问题讨论】:

标签: c++ opengl vbo


【解决方案1】:

您只需将 3 个浮点数传递给您想要传递更多的 VBO:

glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*vertices.size(),&vertices[0],GL_STATIC_DRAW);

当您绑定GL_ELEMENT_ARRAY_BUFFER 时,glDrawElements 中的 void* 是相对于绑定缓冲区的:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*indices.size(), &indices[0], GL_STATIC_DRAW);

glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);

当您遇到问题时,请务必检查 glGetError,这将有助于了解您在哪些调用开始出错。

【讨论】:

  • glGenBuffers(1,&bufferID); glGenBuffers(1,&bufferID2); glBindBuffer(GL_ARRAY_BUFFER,bufferID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,bufferID2); glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*vertices.size(),&vertices[0],GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(GLuint)*indices.size(),&indices[0],GL_STATIC_DRAW); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3,GL_FLOAT,0,0); glDrawElements(GL_TRIANGLES,indices.size(),GL_UNSIGNED_INT,0); glDisableClientState(GL_VERTEX_ARRAY);还是不行。嗯glGetError也没有错误
  • nvm 有效!我的向量中有错误的坐标 -> 三角形
【解决方案2】:

除了@ratched_freak 在他的回答中已经涵盖的问题(错误的大小传递给glBufferData 的顶点,glBufferData 没有调用索引缓冲区,并相应地更新最后一个参数到glDrawElements),你还有另一个问题。仔细查看您的坐标:

vertices.push_back(0.5f);
vertices.push_back(-0.5f);
vertices.push_back(-2.0f);
vertices.push_back(-0.5f);
vertices.push_back(-0.5f);
vertices.push_back(-2.0f);
vertices.push_back(0.5f);
vertices.push_back(-0.5f);
vertices.push_back(-2.0f);

第一个和第三个顶点相同。所以你有一个退化的三角形。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多