Я не совсем уверен, что вы сейчас делаете. Но разумный способ сделать это - не касаться VBO. Вместо этого передайте одну или несколько матриц преобразования в виде униформ в ваш вершинный шейдер и выполните умножение матрицы на графический процессор.
Изменение данных VBO на процессоре является безумным, это означает либо сохранение копии ваших данных вершин на процессоре, итерацию по нему, а также загрузку или отображение буфера и итерацию по нему. В любом случае, это было бы безумно медленным. Весь смысл иметь VBO, так что вы можете загружать свои данные вершин один раз и работать одновременно на CPU, в то время как GPU отключается и выполняет свою работу с указанными данными вершин.
Вместо этого вы просто храните свои вершины один раз в буфере вершин, желательно в пространстве объектов (только для здравого смысла). Затем вы отслеживаете матрицу преобразования для каждого объекта, которая преобразует вершины из пространства объекта в пространство клипа. Вы передаете эту матрицу в свой шейдер вершин и выполняете умножения для каждой вершины на графическом процессоре.
Очевидно, что графический процессор умножает каждую вершину по меньшей мере на одну матрицу на каждый кадр. Но у графического процессора есть параллельное оборудование, которое делает матричное умножение безумно быстрым. Поэтому, особенно когда ваши матрицы постоянно меняются (например, ваши объекты перемещаются), это намного быстрее, чем выполнение на процессоре и обновление массивного буфера. Кроме того, вы освобождаете свой процессор от других вещей, таких как физика или звук или что-то еще.
Теперь я могу себе представить, что вы не захотите НЕ делать этого, если ваш объект никогда не перемещается, однако умножение матрицы GPU, вероятно, примерно на той же скорости, что и умножение флота процессора (я не знаю специфики). Поэтому сомнительно, если для этого стоит большее количество шейдеров для статических объектов.
Резюме:
- Обновление буферов на процессоре является SLOW.
- Матричное умножение на GPU составляет FAST.
- Нет обновлений для буфера обмена? = освободить процессор.
- Умножения на графический процессор? = легко и быстро перемещать объекты (просто измените загружаемую матрицу).
Надеюсь, это немного помогло.
Вы говорите, что каждый кадр вы изменяете данные вершин? С помощью умножения матрицы? Где каждая вершина (для объекта) умножается на одну и ту же матрицу? * На процессоре *? –
Каждый кадр Я создаю матрицу для каждого объекта, который я применяю для масштабирования, вращения и перевода на эту матрицу. – Gopgop