C ++ / OpenGL - 绘制一个立方体VBO

时间:2014-02-15 16:55:11

标签: c++ opengl vbo

最近我开始学习OpenGL,我开始学习它的新资产。有一段时间我一直在尝试使用VBO,从顶点数组中绘制一个简单的立方体。我无法渲染它并理解函数中的一些参数。它没有引起任何错误,但我认为没有任何错误。

float cubeVertPoints[72]; //An array containing the vertex points

这是我的VBO init

void loadBufferData()
{
    glGenBuffers(1, &cubeVBO);
    glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertPoints[0])*3, &cubeVertPoints[0], GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cubeVertPoints[0])*3, (void*)sizeof(GL_FLOAT));
} 

绘图

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBindBuffer(GL_ARRAY_BUFFER, cubeVBO); 
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cubeVertPoints[0])*3, (void*)sizeof(GL_FLOAT));

    glDrawArrays(GL_TRIANGLES, 0, 1); 

    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

1 个答案:

答案 0 :(得分:2)

您没有将所有数据传输到顶点缓冲区。 glBufferData的第二个参数采用所有顶点数据的大小(以字节为单位)。您应该将其设置为sizeof(vertex) * vertex_count

此外,在glEnableVertexAttribArray中调用glVertexAttribPointerloadBufferData是多余的。你应该只在渲染函数中调用它们。

你的第二个问题是glVertexAttribPointer。您没有将正确的偏移量传递给顶点数据中的顶点位置数据"结构"。由于您的顶点仅由位置组成,因此此偏移量应为0。如果你有每个顶​​点的位置和颜色,这些偏移可以是0(对于位置)和sizeof(float) * 3(对于颜色,因为你有3个坐标)。

最后,您只绘制单个顶点。如果您的多维数据集具有72/3=24个顶点,则应绘制24

我认为通过为顶点定义实际结构可以让您的生活更轻松,例如:

struct Vertex
{
  float position[3];
};

然后,您可以使用(GLvoid*)(&((Vertex*)NULL)->position)计算每个顶点位置,颜色等的偏移量。