我知道,这非常令人沮丧。我无法在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()
的先前版本基本相同。
答案 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)
您似乎错过了几个步骤:
glEnableClientState(GL_VERTEX_ARRAY)