我的第一反应是:
//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
数组中加载数据:按原样,所有连续的数据
- 将各种属性的步幅设置为5*sizeof(GLfloat),因为这正是数据中的内容:3个浮点数用于位置,2个浮点数用于纹理坐标。顺便说一下,通常情况下,您希望将这个值设置为2的幂次方,而不像这里。
- 从数组开始处计算偏移量。因此,由于我们首先存储了顶点数据,因此顶点的偏移量为0。纹理坐标在3个位置浮点数后存储,因此其偏移量为3*sizeof(GLfloat)。
我没有在其中包含颜色的原因是:它们通常作为UNORMs存储,这使得初始化代码更加混乱。您需要在同一内存块中存储GLfloat和GLubyte。此时,如果您想在代码中执行此操作,则可以使用结构体,但这在很大程度上取决于最终数据的来源。