C++/OpenGL-用VBO绘制立方体

C++/OpenGL - Drawing a cube VBO

本文关键字:绘制 立方体 VBO OpenGL- C++      更新时间:2023-10-16

最近我开始学习OpenGL,并开始学习它的新资产。有一段时间以来,我一直在尝试使用VBO,从顶点数组绘制一个简单的立方体。我在呈现它和理解函数中的一些参数时遇到了问题。它没有出错,但在我看来什么都没有。

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

这是我的VBO初始化

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

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

此外,在loadBufferData中调用glEnableVertexAttribArrayglVertexAttribPointer也是多余的。应该仅在渲染函数中调用它们。

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

最后,只绘制一个单个顶点。如果立方体具有24顶点,则应绘制72/3=24

我认为你可以通过为顶点定义一个实际的结构来让你的生活更轻松,比如:

struct Vertex
{
float position[3];
};

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