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

标签 c++ opengl vbo

最近我开始学习 OpenGL 并且我开始学习它的新 Assets 。一段时间以来,我一直在尝试使用 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) 计算每个顶点位置、颜色等的偏移量。

关于C++/OpenGL - 绘制立方体 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21800676/

相关文章:

c++ - 与库相关的错误

c++ - 在 Eclipse 中设计 Qt + OpenGL 应用程序

opengl - MSAA 中的 GL_SAMPLE_ALPHA_TO_COVERAGE

opengl - 上传流媒体点的最快方法,偶尔删除

ios - 优化 openGL ES 2.0 2D 纹理输出和帧率

c++ - 将在抽象基类上定义的 vector 的元素与具体的派生类进行匹配

c++ - 错误 : expected constructor, 析构函数,或 ';' token 之前的类型转换?

opengl - 如何使用stencil buffer实现分层裁剪

opengl - 在OpenGL中将纹理映射到VBO的问题

c++ - 为什么这段代码(一些模板的东西)在 msvc10 中编译良好但在 gcc4.8.1 中编译失败?