4

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

当我第一次开始编写应用程序时,我是手动绘制顶点(使用GL_QUADS)并且一切正常。然后我决定改用VBO V ertex B uffer O bjects )。现在没有任何效果。

这是顶点的结构:

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().

4

2 回答 2

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()在这些数组上使用它们。

于 2011-07-26T23:51:59.637 回答
1

您似乎缺少几个步骤:

  • VAO绑定
  • 启用客户端状态 (VBO),例如glEnableClientState(GL_VERTEX_ARRAY)
于 2011-07-26T23:36:12.050 回答