4

我正在尝试为我的渲染代码设置 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。感谢您对我的问题的任何帮助,谢谢。

4

2 回答 2

4

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

当您不使用缓冲区对象,而是使用顶点数组时,您必须通过调用将当前绑定的缓冲区对象取消绑定到 GL_ARRAY_BUFFER 目标

glBindBuffer(GL_ARRAY_BUFFER, 0);
于 2012-10-02T14:10:22.697 回答
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,我不知道为什么这段代码不起作用。有任何想法吗?也许我需要将指向和启用功能从初始化部分移动到渲染部分?

于 2012-10-02T19:52:56.453 回答