рисование чередующихся VBO с glDrawArrays - PullRequest
3 голосов
/ 06 мая 2011

В настоящее время я использую glDrawElements для рендеринга с использованием нескольких VBO (вершина, цвет, текстура и индекс).Я обнаружил, что очень мало общих вершин, поэтому я хотел бы переключиться на glDrawArrays и один чередующийся VBO.

Мне не удалось найти четкий пример 1) создания чередующегося VBOи добавив к нему квад или три (вертикаль, цвет, текстура), и 2) сделав все, что нужно, чтобы нарисовать его, используя glDrawArrays.Какой код для этих двух шагов?

1 Ответ

7 голосов
/ 06 мая 2011

с макушки головы:

//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 в одном и том же фрагменте памяти. На этом этапе структуры могут помочь, если вы хотите сделать это в коде, но это в значительной степени зависит от того, откуда в конечном итоге поступают ваши данные.

...