Возник вопрос, как лучше (быстрее) добавлять к уже существующему VBO новые вершины?
Смысл в том, что для рендера используется только 1 VBO и в него добавлены все меши. А уже из при прорисовке кадра рендерится только нужное из него
Aldaron
> Возник вопрос, как лучше (быстрее) добавлять к уже существующему VBO новые
> вершины?
Хранить свободный хвостик.
> Смысл в том, что для рендера используется только 1 VBO и в него добавлены все
> меши. А уже из при прорисовке кадра рендерится только нужное из него
Но ведь ты заранее все загружаешь, зачем что-то добавлять? Выделяешь память под все и грузишь все... Или я что-то не понял?
Смысл в том, чтобы рендерить все меши за один проход glDrawElements
А добавление нужно чтобы добавлять/удалять из буфера неиспользуемые меши или добавлять те, что попадают в кадр (или вновь появились в сцене)
Или же есть какой-то более подходящий способ рендерить все за один DIP?
Aldaron
>Смысл в том, чтобы рендерить все меши за один проход glDrawElements
И как ты такое реализуешь, если у мешей разные материалы?
Aldaron
Невыгодно.
Объяснять почему?
Big V
> Объяснять почему?
не надо
nes
> И как ты такое реализуешь, если у мешей разные материалы?
Значит для каждого материала свой буфер и его отрисовывать (чтобы за один вызов рисовались несколько объектов)
Тогда нужны идеи как отрисовать как можно больше полезных полигонов за меньшее кол-во проходов
Aldaron
> Значит для каждого материала свой буфер и его отрисовывать (чтобы за один вызов
> рисовались несколько объектов)
Считать при сборке контента. Для того что создаётся или меняется/двигается динамически это не даст никакого ускорения, скорей вызовет тормоза.
Aldaron
Более оптимальный вариант: можно использовать общий материал и текстурный атлас.
Иногда несколько средних DIPов вызвать выгоднее, чем один большой DIP. Правда смотря на сколько большой этот DIP.
Aldaron
> Значит для каждого материала свой буфер и его отрисовывать
Нет. Для каждого меша - свой буфер.
Это бесспорно самый оптимальный вариант.
Иначе либо медленно либо много памяти жрет.
И да, не стремись отрисовать все за один проход.
Где-то слышал что для GPU оптимальнее всего передавать индексы ushort-ами, т.е. лучше, чтобы кол-во индексов не превышало 65535.
если с++ : vector<vertex>
метод : push(v)
но изначально не забыть сделать : reserve(предполагаемый размер буфера)
а вообще зависит от задачи:
если у вас некая динамически меняющаяся поверхность, то вышеприведенный метод подходит
если у вас игровые объекты, которые вы собираетесь накапливаться в массиве и затем передавать видеокарте
то не самая лучшая идея, хотя подобным образом когда то работали объекты в OpenGL называемые list
но подобные техники уже давно не рекомендованы
Тема в архиве.