经典的“什么都没有渲染”的OpenGL问题

时间:2011-07-26 23:33:42

标签: opengl rendering vertex-buffer

我知道,这非常令人沮丧。我无法在OpenGL应用程序中显示任何内容 - 我看到的只是一个空视口。

当我第一次开始编写应用程序时,我手动绘制顶点(使用GL_QUADS),一切正常。然后我决定切换到VBOs (Vertex Buffer Objects)。现在没有任何作用。

这是顶点的结构:

struct SimpleVertex
{
    GLfloat x, y;
    GLbyte r, g, b, a;
};

如您所见,它非常简单 - 顶点和RGBA颜色数据的x和y坐标。这是填充顶点和索引缓冲区的代码:

const SimpleVertex rect_vertices[] = {
    { -0.8,  0.8, 0, 255, 0, 128 },
    {  0.8,  0.8, 0, 255, 0, 128 },
    {  0.8, -0.8, 0, 255, 0, 128 },
    { -0.8, -0.8, 0, 255, 0, 128 }
};

const GLuint rect_indices[] = {
    0, 1, 2, 3
};

GLuint vertices;
GLuint indices;

glGenBuffers(1, &vertices);
glBindBuffer(GL_ARRAY_BUFFER, vertices);
glBufferData(GL_ARRAY_BUFFER,
             sizeof(rect_vertices),
             rect_vertices,
             GL_STATIC_DRAW);

glGenBuffers(1, &indices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
             sizeof(rect_indices),
             rect_indices,
             GL_STATIC_DRAW);

最后但同样重要的是,这是应该绘制矩形的代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glBindBuffer(GL_ARRAY_BUFFER, vertices);
glVertexPointer(2, GL_FLOAT, 0, NULL);
glColorPointer(4, GL_BYTE, 0,
               (const GLvoid *)(sizeof(GLfloat) * 2));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, NULL);

glDisable(GL_BLEND);

我无法弄清楚为什么没有渲染。顶点和颜色数据与使用glVertex2f()的先前版本基本相同。

2 个答案:

答案 0 :(得分:3)

仅仅调用gl * Pointer函数是不够的;你需要告诉OpenGL它应该从那些特定的数组拉出来。对于内置数组(glVertexPointer,glColorPointer等),对于所讨论的特定数组,使用glEnableClientState()

例如:

glBindBuffer(GL_ARRAY_BUFFER, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, NULL);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_BYTE, 0, (const GLvoid *)(sizeof(GLfloat) * 2));

这应该会提供更好的结果。

完成渲染后,您还应该在这些阵列上使用glDisableClientState()

答案 1 :(得分:1)

您似乎错过了几个步骤:

  • VAO绑定
  • 启用客户端状态(VBO),例如glEnableClientState(GL_VERTEX_ARRAY)