с макушки головы:
//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 для texcoord. Примечание: обычно вы хотите, чтобы это было степень 2, в отличие от этого.
- смещение вычисляется с начала массива. так как мы сначала сохраняем вершину, смещение для вершины равно 0. texcoord сохраняется после 3-х операций с данными положения, поэтому его смещение составляет 3 * sizeof (GLfloat).
Я не включил туда цвет по причине: обычно они хранятся как UNORM, что делает код инициализации более сложным. Вам нужно хранить и GLfloat, и GLubyte в одном и том же фрагменте памяти. На этом этапе структуры могут помочь, если вы хотите сделать это в коде, но это в значительной степени зависит от того, откуда в конечном итоге поступают ваши данные.