Многоблочные объекты буфера вершин (VBO) в lwjgl - PullRequest
0 голосов
/ 08 января 2012

Я смог заставить 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.

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

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Поместить ВСЕ мои сетки в один и тот же буфер не очень эффективно.

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

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

1 голос
/ 08 января 2012

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

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

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

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

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

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

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

...