opengl es VBO用法 - 没有几何渲染

时间:2012-10-02 13:50:45

标签: ios opengl-es vbo

我正在尝试为我的渲染代码设置VBO以获得更多fps。它适用于顶点位置,颜色和纹理坐标的单独VBO,但在转换为交错顶点数据后,没有几何渲染。 这是我的设置功能:

const GLsizeiptr data_size = NUMBER_OF_CUBE_VERTICES * 9 *sizeof(float);
// allocate a new buffer
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ARRAY_BUFFER, data_size, data, GL_STATIC_DRAW);

float* ptr = (float*)data;
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (ptr + 0));
glEnableVertexAttribArray(ATTRIB_VERTEX);

glVertexAttribPointer(ATTRIB_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (ptr + 3));
glEnableVertexAttribArray(ATTRIB_COLOR);

glVertexAttribPointer(ATTRIB_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (ptr + 7));
glEnableVertexAttribArray(ATTRIB_TEXCOORD0);

glGenBuffers(1, &cubeIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, NUMBER_OF_CUBE_INDICES*sizeof(GLubyte), s_cubeIndices, GL_STATIC_DRAW);

数据数组如下所示:

static float data[] =
{
//  position  //   // color // //UV//
-1.0, +1.0, +1.0,  255,0,0,255, 0,0,
-1.0, -1.0, +1.0,  0,255,0,255, 0,0,
+1.0, +1.0, +1.0,  255,0,255,255, 0,0,
+1.0, -1.0, +1.0,  255,0,0,255, 0,0,

+1.0, +1.0, +1.0,  255,0,0,255, 0,0,
+1.0, -1.0, +1.0,  255,0,0,255, 0,0,
+1.0, +1.0, -1.0,  255,255,0,255, 0,0,
+1.0, -1.0, -1.0,  255,0,0,255, 0,0,

+1.0, +1.0, -1.0,  255,0,255,255, 0,0,
+1.0, -1.0, -1.0,  255,255,0,255, 0,0,
-1.0, +1.0, -1.0,  0,255,0,255, 0,0,
-1.0, -1.0, -1.0,  255,0,0,255, 0,0,

-1.0, +1.0, -1.0,  0,0,255,255, 0,0,
-1.0, -1.0, -1.0,  255,0,0,255, 0,0,
-1.0, +1.0, +1.0,  255,255,0,255, 0,0,
-1.0, -1.0, +1.0,  255,0,0,255, 0,0,
};

这是我的渲染代码:

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIBO);
glDrawElements(GL_TRIANGLE_STRIP, NUMBER_OF_CUBE_INDICES, GL_UNSIGNED_BYTE, s_cubeIndices);

此外,我尝试使用没有索引缓冲区的DrawArrays函数,但结果是相同的 - 没有渲染几何体。 我的程序运行时,输出窗口中还有GLError 1282。 对于我的问题,我很感激。谢谢。

2 个答案:

答案 0 :(得分:4)

当您使用缓冲区对象时,glVertexAttribPointer的最后一个参数应该偏移到您需要的数据。例如,您的ATTRIB_VERTEX数组将从偏移量0开始,ATTRIB_COLOR数组偏移量为sizeof(float)* 3(因为位置需要三个浮点数),等等...

如果不使用缓冲区对象,而是使用顶点数组,则必须通过调用

将当前绑定的缓冲区对象解除绑定到GL_ARRAY_BUFFER目标
glBindBuffer(GL_ARRAY_BUFFER, 0);

答案 1 :(得分:0)

好的,我使用了glVertexPointer和glEnableClientState函数。但是对于glVertexAttribPointer和glEnableVertexAttribArray,由于某种原因仍然没有几何渲染。 现在代码看起来像这样: VBO init:

struct Vertex
{
  GLfloat x, y, z;
  GLubyte r, g, b, a;
};
......

const GLsizeiptr data_size = NUMBER_OF_CUBE_VERTICES *sizeof(struct Vertex);
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);

glBufferData(GL_ARRAY_BUFFER, data_size, vertices, GL_STATIC_DRAW);

glVertexPointer(3, GL_FLOAT, sizeof(struct Vertex), (GLvoid*)((char*)NULL));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(struct Vertex), (GLvoid*)offsetof(struct Vertex, r));
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

渲染:

glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glDrawArrays(GL_TRIANGLE_STRIP, 0, NUMBER_OF_CUBE_VERTICES);

如果切换到glVertexAttribPointer / glEnableVertexAttribArray,我不知道为什么这段代码不起作用。有任何想法吗?也许我需要从初始化部分移动指向和启用函数来渲染部分?