ПрограммированиеФорумГрафика

Как лучше добавлять вершины в VBO. (Расширение VBO во время исполнения)

#0
11:21, 31 июля 2013

Возник вопрос, как лучше (быстрее) добавлять к уже существующему VBO новые вершины?

Смысл в том, что для рендера используется только 1 VBO и в него добавлены все меши. А уже из при прорисовке кадра рендерится только нужное из него

#1
11:23, 31 июля 2013

Aldaron
> Возник вопрос, как лучше (быстрее) добавлять к уже существующему VBO новые
> вершины?
Хранить свободный хвостик.

> Смысл в том, что для рендера используется только 1 VBO и в него добавлены все
> меши. А уже из при прорисовке кадра рендерится только нужное из него
Но ведь ты заранее все загружаешь, зачем что-то добавлять? Выделяешь память под все и грузишь все... Или я что-то не понял?

#2
11:34, 31 июля 2013

Смысл в том, чтобы рендерить все меши за один проход glDrawElements

А добавление нужно чтобы добавлять/удалять из буфера неиспользуемые меши или добавлять те, что попадают в кадр (или вновь появились в сцене)

Или же есть какой-то более подходящий способ рендерить все за один DIP?

#3
11:47, 31 июля 2013

Aldaron
>Смысл в том, чтобы рендерить все меши за один проход glDrawElements
И как ты такое реализуешь, если у мешей разные материалы?

#4
11:51, 31 июля 2013

Aldaron
Невыгодно.
Объяснять почему?

#5
11:55, 31 июля 2013

Big V
> Объяснять почему?
не надо

nes
> И как ты такое реализуешь, если у мешей разные материалы?
Значит для каждого материала свой буфер и его отрисовывать (чтобы за один вызов рисовались несколько объектов)

Тогда нужны идеи как отрисовать как можно больше полезных полигонов за меньшее кол-во проходов

#6
13:50, 31 июля 2013

Aldaron
> Значит для каждого материала свой буфер и его отрисовывать (чтобы за один вызов
> рисовались несколько объектов)
Считать при сборке контента. Для того что создаётся или меняется/двигается динамически это не даст никакого ускорения, скорей вызовет тормоза.

#7
14:29, 31 июля 2013

Aldaron
Более оптимальный вариант: можно использовать общий материал и текстурный атлас.

Иногда несколько средних DIPов вызвать выгоднее, чем один большой DIP. Правда смотря на сколько большой этот DIP.

#8
14:35, 31 июля 2013

Aldaron
> Значит для каждого материала свой буфер и его отрисовывать
Нет. Для каждого меша - свой буфер.
Это бесспорно самый оптимальный вариант.
Иначе либо медленно либо много памяти жрет.
И да, не стремись отрисовать все за один проход.

#9
14:40, 31 июля 2013

Где-то слышал что для GPU оптимальнее всего передавать индексы ushort-ами, т.е. лучше, чтобы кол-во индексов не превышало 65535.

#10
16:31, 31 июля 2013

если с++ : vector<vertex>
метод : push(v)
но изначально не забыть сделать : reserve(предполагаемый размер буфера)

а вообще зависит от задачи:
если у вас некая динамически меняющаяся поверхность, то вышеприведенный метод подходит
если у вас игровые объекты, которые вы собираетесь накапливаться в массиве и затем передавать видеокарте
то не самая лучшая идея, хотя подобным образом когда то работали объекты в OpenGL называемые list
но подобные техники уже давно не рекомендованы

ПрограммированиеФорумГрафика

Тема в архиве.