OpenGL 基本 IBO/VBO 不工作

Posted

技术标签:

【中文标题】OpenGL 基本 IBO/VBO 不工作【英文标题】:OpenGL Basic IBO/VBO Not Working 【发布时间】:2012-02-11 03:27:12 【问题描述】:

我一直在关注here 列出的教程。

我想使用索引缓冲区对象、顶点缓冲区对象、我自己的顶点和片段着色器以及我自己的顶点结构来绘制一个三角形。

我的问题是我画画的时候什么都没有。我不确定我做错了什么。我的着色器工作正常,我已经在不使用 ibo/vbo 的情况下对它们进行了测试,它们很好。

这是我的代码:

GLuint  vao[1], vbo_vertex[1], index_buffer[1];

typedef struct
    GLfloat x,y,z;      // Vertex.
    GLfloat r,g,b;  // Colors.
 spicyVertex;

void initializeBuffers()

    spicyVertex* simple_triangle = new spicyVertex[3];
    // V0 - bottom
    simple_triangle[0].x = 0.0f;
    simple_triangle[0].y = -0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V1 - top right
    simple_triangle[0].x = 0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V2 - top left
    simple_triangle[0].x = -0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // Setup the vertex buffer data.
    glGenBuffers(1, &vbo_vertex[0]);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(spicyVertex), simple_triangle, GL_STATIC_DRAW);


    // Index setup
    GLushort *indices = new GLushort[3];
    indices[0]=0;
    indices[1]=1;
    indices[2]=2;
    glGenBuffers(1, &index_buffer[0]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*sizeof(GLushort), indices, GL_STATIC_DRAW);

    // By this point all of our data should be on the graphics device.


    // VAO setup.
    glGenVertexArrays(1, &vao[0]);
    glBindVertexArray(vao[0]);

    // Bind the vertex buffer and setup pointers for the VAO.
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(3);

    // Bind the index buffeer for the VAO.
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);

    // Cleanup.
    delete [] simple_triangle;
    delete [] indices;
    glBindVertexArray(0);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);


void Draw_indexed_Vao()
    glBindVertexArray(vao[0]);      // select first VAO
    glDrawRangeElements(GL_TRIANGLES,0, 3, 3, GL_UNSIGNED_SHORT, NULL);
    glBindVertexArray(0);


static void display(void)
    glUseProgramObjectARB( programObj );

    Draw_indexed_Vao();

我没有执行任何视图转换,当我使用更基本的绘制方法时,一切都在镜头前显示得很好。我确实认为这与我声明这些缓冲区的方式有关。

编辑 1: 应用程序是双缓冲的。

编辑 2: 已解决。 3 个顶点 V0、V1 和 V2 都在修改同一个数组元素。例如,我没有使用simple_triangle[0]simple_triangle[1]simple_triangle[2],但我只使用simple_triangle[0]。再次感谢您发现我的愚蠢错误。

【问题讨论】:

你的意思是V1和V2是simple_triangle[1]和simple_triangle[2]? 啊!这样就解决了,非常感谢。小错误可能会被忽视并造成很多麻烦。 【参考方案1】:

添加实际答案。

V1 和 V2 都在修改 simple_triangle[0],所以只有一个顶点。

【讨论】:

【参考方案2】:

您可能需要调用glFlush() 才能将您绘制到的缓冲区的内容推送到屏幕上。此外,根据您是否使用双缓冲,所需的调用可能是 glutSwapBuffers()(如果您使用 GLUT)或其他一些交换调用。

【讨论】:

我用过 glFlush() 并没有成功,一直在交换。 啊,好的,只是在提供的代码中没有看到。看起来 loganfsmyth 发现了这个问题。很高兴你让它工作:)【参考方案3】:

你可能想改变

'gl顶点AttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

'gl颜色AttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));'

但我不能 100% 确定。

【讨论】:

以上是关于OpenGL 基本 IBO/VBO 不工作的主要内容,如果未能解决你的问题,请参考以下文章

opengl linux undefined 对基本功能的引用

为啥我的 OpenGL 纹理不起作用?

OpenGL理解一些基本问题

Open GL:多线程 glFlushMappedBufferRange?

OpenGL/Glew C++ 纹理不适用

Opengl ES之PBO