我目前正在使用 glDrawElements 来使用多个 VBO(顶点、颜色、纹理和索引)进行渲染。我发现共享的顶点很少,所以我想切换到 glDrawArrays 和单个交错 VBO。
我一直无法找到一个明确的例子:1)创建一个交错的 VBO 并为其添加一个四边形或三边形(垂直、颜色、纹理),以及 2)使用 glDrawArrays 做任何需要绘制它的事情。这两个步骤的代码是什么?
在我的头顶上:
//init
glBindBuffer(GL_ARRAY_BUFFER, new_array);
GLfloat data[] = {
0.f, 0.f, 0.f, 0.f, 0.f,
0.f, 0.f, 100.f, 0.f, 1.f,
0.f, 100.f, 100.f, 1.f, 1.f,
0.f, 100.f, 100.f, 1.f, 1.f,
0.f, 100.f, 0.f, 1.f, 0.f,
0.f, 0.f, 0.f, 0.f, 0.f,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
// draw
glBindBuffer(GL_ARRAY_BUFFER, new_array);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), NULL);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), ((char*)NULL)+3*sizeof(GLfloat) );
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
这段代码没有什么特别神奇的地方。看看如何:
data
被加载:原样,所有连续的我没有在其中包含颜色是有原因的:它们通常存储为 UNORM,这使得初始化代码更加混乱。您需要将 GLfloat 和 GLubyte 存储在同一个内存块中。此时,如果您想在代码中执行此操作,结构可以提供帮助,但这在很大程度上取决于您的数据最终来自何处。