Буферы вершин в opengl - PullRequest
       11

Буферы вершин в opengl

4 голосов
/ 05 апреля 2010

Я делаю небольшую трехмерную графическую игру / демо-версию для личного изучения. Я знаю d3d9 и немного о d3d11, но немного о opengl на данный момент, поэтому я собираюсь абстрагироваться от фактического рендеринга графики, чтобы мой граф сцены и все «выше» ему нужно было знать немного о том, как на самом деле рисовать графика. Я намереваюсь заставить его работать с d3d9, затем добавить поддержку d3d11 и, наконец, поддержку opengl. Так же, как учебное упражнение, чтобы узнать о трехмерной графике и абстракции.

Я пока не очень разбираюсь в opengl и не хочу, чтобы мой абстрактный интерфейс представлял что-то непростое для реализации в opengl. В частности, я смотрю на буферы вершин. В d3d они по сути являются массивом структур, но, глядя на интерфейс opengl, кажется, что это вершинные массивы. Однако, похоже, что они организованы довольно по-разному, где вам нужен отдельный массив для вершин, один для нормалей, один для координат текстуры и т. Д., И установите с помощью glVertexPointer, glTexCoordPointer и т. Д.

Я надеялся, что смогу реализовать интерфейс VertexBuffer во многом как у directx, но похоже, что в d3d у вас есть массив структур, а в opengl вам нужен отдельный массив для каждого элемента, что делает поиск общей абстракции довольно простым трудно сделать эффективным.

Есть ли способ использовать opengl аналогично Directx? Или какие-либо предложения о том, как создать абстракцию более высокого уровня, которая будет эффективно работать с обеими системами?

1 Ответ

3 голосов
/ 05 апреля 2010

Вершинные массивы имеют атрибуты шага и смещения. Это специально для учета массивов структуры.

Итак, если вы хотите установить VBO с вершиной float3 и текстурной координатой float2, вы должны сделать следующее:

// on creation of the buffer
typedef struct { GLfloat vert[3]; GLfloat texcoord[2]; } PackedVertex;
glBindBuffer(GL_ARRAY_BUFFER, vboname);
glBufferData(...); // fill vboname with array of PackedVertex data

// on using the buffer
glBindBuffer(GL_ARRAY_BUFFER, vboname);
glVertexPointer(3, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(0)));
glTexCoordPointer(2, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, texcoord));

С помощью BUFFER_OFFSET макрос для преобразования смещений в соответствующие указатели (vbos использует параметр указателя в качестве смещения) и смещение другого макроса для нахождения смещения texcoord внутри структуры PackedVertex. Здесь, скорее всего, sizeof (float) * 3, так как внутри структуры вряд ли будет какое-либо заполнение.

...