VBO содержит только вершины одинакового размера? - PullRequest
0 голосов
/ 13 июня 2011

Имеет ли OpenGL / OpenGLES VBO только одну и ту же вершину размера?

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

Это поведение отличается от буфера вершин DirectX, в Directx есть SetStreamSource, который можно использовать для смещения VerterxБуфер вместе с DrawIndexedPrimitive ваш VB может содержать вершины произвольного размера.

может быть, OpenGLES 1.1 версия SetStreamSource недоступна?может быть OpenGLES 2.0 будет поддерживать его?

Моя целевая платформа - iPhone OpenGLES 1.1, поэтому, если версия GL SetStreamSource недоступна, я собираюсь отказаться от использования VBO, потому что: 1. это приносит больше проблем (у меня будетвыделить много VBO, содержащих вершины разных размеров) 2. В любом случае улучшения производительности нет (аппаратная поддержка в OpenGLES 1.1 отсутствует)

спасибо за чтение и большое спасибо за то, что поделились своим опытом о правильных способах использования VBO в OpenGLES1.1., Спасибо.

Ответы [ 2 ]

1 голос
/ 13 июня 2011

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

1 голос
/ 13 июня 2011

Буферные объекты OpenGL (VBO является одним из шаблонов использования) могут содержать произвольную информацию. Но функции рисования (например, glDrawElements) работают с непрерывным массивом информации о вершинах одинакового формата (очевидно, что каждая вершина занимает один и тот же размер). Если это тот размер, о котором вы спрашивали - тогда я не понимаю, как его можно изменить.

Если вы хотите использовать VBO из определенного смещения (например, содержащего вершины другого формата) - тогда для вас есть последний параметр glVertexAttribPointer. Когда VBO привязан, этот последний параметр является байтовым смещением сегмента данных, используемого для атрибутов вершины.

...