VBO:未绘制数组

Posted

技术标签:

【中文标题】VBO:未绘制数组【英文标题】:VBO: Array not drawn 【发布时间】:2013-01-30 12:58:06 【问题描述】:

我正在关注this guide,我正在尝试在屏幕上绘制一个四边形。我也看到了源代码,它是一样的,它应该可以工作,但在我的情况下,屏幕上什么都没有显示。我正在使用带有顶点着色器的 OpenGL 2.0,它只是将颜色设置为红色,以使四边形在屏幕上可见。

在 callig glutMainLoop 之前,我生成了顶点缓冲区对象:

#include <GL/glut.h>
#include <GL/glew.h>

vector<GLfloat> quad; 
GLuint buffer;

void init()

    // This routine gets called before glutMainLoop(), I omitted all the code
    // that has to do with shaders, since it's correct.
    glewInit();
    quad= vector<GLfloat>-1,-1,0, 1,-1,0, 1,1,0, -1,1,0;
    glGenBuffers(1,&buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*12,quad.data(),GL_STATIC_DRAW);

这是我的渲染例程:

void display()

    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,buffer);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
    // I also tried passing quad.data() as last argument, but nothing to do.
    glDrawArrays(GL_QUADS,0,12);
    glDisableVertexAttribArray(0);

    glutSwapBuffers();

问题是屏幕上没有任何东西,我只看到一个黑色的窗口。四边形应该是红色的,因为我在顶点着色器中设置了红色。

【问题讨论】:

"使用顶点着色器,将颜色设置为红色" - 然后向我们展示您的顶点和片段着色器。顺便问一下,你确定你的顶点着色器设置了颜色吗? 还显示您的其余设置,您可以在其中编译和链接着色器以及所有这些东西。 即使我不使用任何着色器并使用 glColor3f 或 GL_COLOR_ARRAY 设置颜色,我也会遇到同样的问题。 【参考方案1】:

所以问题可能出在 glDrawArrays(GL_QUADS, 0, 12);必须是 glDrawArrays(GL_QUADS, 0, 4);

【讨论】:

步长如果连续元素之间的差距。 所以问题可能出在 glDrawArrays(GL_QUADS, 0, 12);必须是 glDrawArrays(GL_QUADS, 0, 4); 是的,但它仍然没有绘制四边形。 你也可以使用0作为步幅,如果属性是紧密的,就像他的例子一样。但实际上您的评论是完全正确的(并且可能是他问题的解决方案)。所以我建议你用你的评论替换你当前的答案(这至少会让你从我这里获得+2)。 @RamyAlZuhouri “步幅是连续元素之间的差距” - 不,不是。实际上是一个元素的start和下一个元素的start之间的差距,所以他的3*sizeof(float)确实是正确的。但是,您是对的,因为这仍然不是您问题的解决方案,因为 0 的步幅也适用于您的情况。【参考方案2】:

我错过了这样的 glEnableClientState:

glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_QUADS,0,12);
glDisableClientState(GL_VERTEX_ARRAY);

【讨论】:

以上是关于VBO:未绘制数组的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果

[转]OpenGL 通过VBO实现顶点数组绘制顶点

OpenGL顶点数组对象不记录VBO和IBO绑定

OpenGL中的动态VBO

OpenGL VBO 绘制顺序

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