Я не уверен, что полностью понимаю, что вы имеете в виду, когда говорите, что у вас вершины разных размеров. Но OpenGL может работать с любыми вершинными форматами D3D.
В OpenGL отсутствует понятие вершины "потоки". Это потому, что они не нужны; думать о каждом отдельном атрибуте (позиции, нормали, цвета и т. д.) как отдельный поток. Но все они могут поступать из одного и того же буфера, и все они могут быть переплетены друг с другом.
Работа буферных объектов довольно проста. Буферный объект - это просто размерный блок памяти, управляемый OpenGL. Вы можете поместить в него любые байты, какие захотите.
Чтобы сообщить OpenGL, как извлекать данные вершин из него, вы должны определить количество массивов, каждый из которых связан с атрибутом. Для этого используются функции glVertexPointer, glNormalPointer и т. Д .; они все в форме gl * Pointer. То, что вы, кажется, уже поняли.
Что вы, возможно, не понимаете, так это то, что формат вершин, определенный этими функциями, не всегда связан с буферным объектом. Например, вы можете использовать трехмерные позиции с байтовыми цветами, все из одного и того же объекта буфера:
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glEnableClientState(GL_VERTEX_ARRAY); //Our vertices contain positions.
glVertexPointer(3, GL_FLOAT, 16, (void*)0); //The last parameter is the byte offset from the beginning of the buffer to where the data starts.
glEnableClientState(GL_COLOR_ARRAY); //Our vertices contain colors.
glColorPointer(4, GL_UNSIGNED_BYTE, 16, (void*)12); //Offset must add in the 3 floats from the vertex.
//Draw stuff.
Затем позже вы можете переопределить этот указатель, изменив формат так, как вы хотите. На этот раз мы используем 2D-позиции, определенные как шорты, и вообще без цветов:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_SHORT, 4, (void*)1024);
glDisableClientState(GL_COLOR_ARRAY); //Our vertices contain no colors.
//Draw stuff.
Привязка буфера не изменялась между этими вызовами. Этот новый массив начинается с 1024 байтов от начала буфера. Таким образом, вы можете поместить данные для нескольких объектов в один буфер.
Теперь есть одна вещь, которую OpenGL ES 1.1 не предлагает, что делает D3D. Когда вы вызываете DrawIndexedPrimitives, вы можете указать смещение, которое добавляется к каждому индексу перед извлечением вершин из массивов. Desktop OpenGL 3.2 и выше обеспечивает это (и более низкие версии через расширения), но не ES 1.1.