Многовершинные буферные объекты (VBO) в lwjgl

Мне удалось заставить VBO работать с одной сеткой. Сначала я настроил opengl:

//....
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);

Для каждого меша я генерирую буфер (два вызова этой функции на меш):

vertBuffer = GL15.glGenBuffers( BufferUtils.createIntBuffer(1)); 
//same idea for faceBuffer

Я помещаю данные сетки в FloatBuffers и IntBuffers. Затем я должен отправить их в opengl:

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertBuffer)
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, myVertPositions,GL15.GL_STATIC_DRAW);
//same idea for faces.

Примечание. Все вышеперечисленные шаги выполняются только один раз.

Наконец есть рендеринг:

//...
int stride = 0; //0 = compact arrays.
int offset = 0; //Each mesh would need a different offset?

GL11.glVertexPointer(3, GL11.GL_FLOAT, stride, offset);
GL12.glDrawRangeElements(GL11.GL_TRIANGLES, 0, numVerts, 
        numFaces*3, GL11.GL_UNSIGNED_INT, offset);
//Using the "buffer versions" of these functions throws  
//"Cannot use Buffers when Array Buffer Object is enabled"
//Whether or not glEnableClientState is called.

Любая новая сетка, которую я добавляю, перезаписывает старую сетку. Помещение ВСЕХ моих мешей в один и тот же буфер звучит неэффективно. Как еще я могу заставить несколько мешей сосуществовать?


person Kevin Kostlan    schedule 08.01.2012    source источник


Ответы (2)


это довольно простой вопрос.

Чтобы использовать несколько VBO, вы должны сохранить идентификатор, присвоенный функцией glGenBuffers, в качестве ссылки на Mesh.

затем, когда вы хотите нарисовать эту конкретную сетку, вам нужно связать ее следующим образом (отрывок кода моего движка):

glBindBuffer(GL_ARRAY_BUFFER, Object_To_Draw->PATRIA_Model->MODEL_VBO_ID);

Как будто у вас есть 3 меша, яблоко, груша и апельсин, у каждого свой ID.

Если вы хотите использовать яблоко, вы привязываете идентификатор яблока (простыми словами вы говорите графическому процессору, возьмите данные геометрии из памяти, хранящей яблоко.... :)), если вы хотите, чтобы груша вы указали то и осо дальше.

Я надеюсь, что это помогло.

person Maurizio Benedetti    schedule 08.01.2012

Помещение ВСЕХ моих мешей в один и тот же буфер звучит неэффективно.

На самом деле это так: Переключение VBO дороже, чем установка некоторого смещения. Особенно для множества мелких (по количеству вершин) объектов рекомендуется помещать их в один VBO.

В любом случае: вы можете использовать столько VBO, сколько захотите. glGenBuffers дает вам идентификатор, который позволяет идентифицировать эти буферы и нацеливать их с помощью glBindBuffer.

person datenwolf    schedule 08.01.2012
comment
Но если я весь свой мир вложу в VBO и он намного превысит GL_MAX_ELEMENTS_VERTICES=33000, проблем не будет? - person Kevin Kostlan; 08.01.2012
comment
@KevinKostlan: это всего лишь рекомендация, и она применяется только к размеру массива индексов элементов, передаваемого в glDrawElements. И не обязательно рисовать все сразу. Также вы можете использовать ненулевые смещения в VBO и использовать несколько вызовов отрисовки. - person datenwolf; 09.01.2012