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

Posted

技术标签:

【中文标题】C++/OpenGL - 绘制立方体 VBO【英文标题】:C++/OpenGL - Drawing a cube VBO 【发布时间】:2014-02-15 16:55:10 【问题描述】:

最近我开始学习 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);

【问题讨论】:

您的矩阵可能不正确。作为 Identity 的 ModelView 看起来不正确。另外,停止使用固定管道。它在您声称要定位的较新 GL 中已弃用。 【参考方案1】:

您没有将所有数据传输到顶点缓冲区。 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) 计算每个顶点位置、颜色等的偏移量。

【讨论】:

以上是关于C++/OpenGL - 绘制立方体 VBO的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBO 的 OpenGL 贪心网格划分

如何使用 VBO 和单个 OpenGL drawelements 调用绘制多个对象?

如何使用不同的 VAO、VBO 绘制 2 个或更多对象?

游戏环境中的 OpenGL VBO/DisplayList

在OpenGL中实现VBO,窗口保持黑色

使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理