Я только начинаю работать с OpenGL и пытаюсь использовать его для создания 2D-игры. В этой игре у меня есть шестиугольная сетка, состоящая из очень большого разнообразия шестиугольников разного цвета. Как начинающий программист OpenGL, я вижу два способа рисования этой сетки:
- Использование буфера вершин с данными для одного шестиугольника, затем использование равномерного значения смещения и итерация на процессоре для многократного рисования одной и той же программы, пока у меня не будет сетки.
- Создание единственного очень большого предварительно рассчитанного буфера вершин, который рисует все шестиугольники за один вызов.
Какой самый эффективный метод? Есть ли лучший способ сделать это?
Ответы:
Есть действительно несколько способов сделать такую сетку.
Наиболее эффективным способом было бы создание экземпляров. Таким образом, вы делаете свой шестиугольник только один раз в VBO, и рендеринг это сто, тысяча или миллион раз. Вы можете сделать это вручную, используя шейдеры с униформой, как вы сказали в пункте 1, но для этого также есть встроенная функциональность OpenGL. Для этого взгляните на glDrawElementsInstanced .
Обратите внимание, что создание экземпляров происходит быстрее, чем другие методы, если вы рисуете больше определенного количества экземпляров объектов. Например, рисование 300 может быть быстрее с использованием 1 большого VBO, но рисование 2 миллионов может быть быстрее, если вы используете рендеринг с использованием экземпляров.
Если вы используете рендеринг экземпляров, вы можете отправлять данные по каждому объекту, используя разделители атрибутов . В вашем случае вы хотели бы отправить позицию и цвет.
Хороший учебник по рендерингу в инстансах: нажмите
Действительно лучший способ - это попробовать оба метода и проверить количество миллисекунд, необходимое для рисования 1 кадра. Таким образом, вы также изучите оба пути, что всегда хорошо.
Также обратите внимание, что рендеринг экземпляров - это современная функциональность OpenGL, и вам придется использовать шейдеры для ее использования. Но всегда лучше научиться этому с самого начала.
источник
Метод 1 проще кодировать и будет хорошо, если у вас не слишком много шестиугольников. Возможно, вы захотите придерживаться этого, поскольку вы новичок в OpenGL, чтобы избежать одновременной чрезмерной сложности.
Если одновременно видно большое количество шестиугольников (например, несколько сотен или более тысячи), потребуется метод с меньшими издержками, чтобы избежать чрезмерной нагрузки ЦП на выполнение такого количества отдельных операций извлечения. Метод 2 будет работать для этого, или даже лучше, использовать инстансинг. Я ожидаю, что инстансирование будет быстрее, чем метод 2, или, конечно, не хуже, поскольку вам нужно только обновить буфер данных для каждого экземпляра, а не (намного больший) буфер данных вершин для всех экземпляров.
источник