OpenGL: рендеринг множества кубов

Я пытаюсь создать сетку 600x600x600, содержащую единичные кубы (или сферы). Только некоторые из кубиков присутствуют. Итак, в основном я пытаюсь сделать что-то вроде следующего, составленного из маленьких кубиков или сфер.

3D Shadow Hull

Вопрос 1Предоставление такой структуры является дорогостоящим. Требуется 3 вложенных цикла (каждая из 600 итераций). Есть ли способ справиться с этим?

Я подумал о том, чтобы объединить соседние кубы в один (окт-деревья), так как в моем случае не будет слишком много пробелов. Но я хочу общее решение этого. Как вы думаете, сколько времени потребовалось бы для рендеринга такой сцены выше (похоже на сцену размером 250x250x250)?

вопрос 2: Рендеринг экземпляра связан с моей проблемой?

ЗаметкаЗдесь я представляю воксель как куб, которому, в свою очередь, нужно 6 квадов.

2

Решение

Я делал воксельные рендеринг движки в прошлом. Вот несколько быстрых оптимизаций, которые я могу предложить, которые дадут вам хороший прирост скорости:

  1. Используйте геометрический алгоритм отбраковки, чтобы отбраковывать биты, которые не отображаются. Я использую октавы, так как они отлично сочетаются с вокселями.
  2. Сортируйте видимые узлы спереди назад и используйте некоторый алгоритм, чтобы определить, какие узлы не будут видны вообще. Кроме того, хорошо использовать выбраковку окклюзии.
  3. Используйте геометрические шейдеры, как предлагали другие.
  4. Имейте схему LOD в месте. Проще говоря, если два куба могут быть объединены в один и результат будет незаметен для пользователя, то сделайте это. Хорошая схема LOD может значительно уменьшить объем данных, которые вы отображаете.
  5. Помните, что лучший полигон — это тот, который вообще не нарисован :).

Если все сделано правильно, эти три вещи дадут вам большую часть того ускорения, которое вы ищете. После этого все его настройки в соответствии с вашими потребностями и требованиями.

1

Другие решения

Действительно, проблема 1 может быть решена путем объединения различных кубов в один большой куб. Двигатели Voxel часто группируют несколько отдельных блоков в куски. Это, пожалуй, лучший путь.
Во-вторых, вы можете использовать логическую переменную для каждого вокселя, а также для чанка, содержащего эти воксели, и установить 1 для рендеринга или 0 в противном случае.
Вам потребуются класс вокселей, класс чанков и некоторые другие абстракции в зависимости от ваших требований.

0

Возможно, создадим геометрический шейдер, который будет копировать блок для каждой точки сетки. Запрограммируйте интеллектуальный шейдер так, чтобы он не выводил стороны, отвернутые от вида, и стороны, где рядом находится «активная» коробка.

Задача состоит в том, чтобы предоставить геометрическому шейдеру булевы значения размером 600 * 600 * 600. Если составной «объект» несколько тверд, возможно, вам нужно только указать начальную и конечную позиции в каждой строке / столбце кубов, поэтому: 1,4,90,345 означает заполнить позиции от 1 до 4 и от 90 до 345 кубиками.

0

Вопрос 1:

Я не знаю, как у вас получается рендерить 3 вложенных цикла. Я вижу одну огромную петлю с 600 ^ 3 вокселями. Последнее, что вы хотите сделать, это визуализировать каждый воксель по отдельности, поскольку ваш графический процессор является потоковым многоядерным процессором, а ваши данные практически одинаковы, за исключением перевода в пространстве. Чтобы быть справедливым, это число, вероятно, слишком велико для начала. В настоящее время требуется около 64 000 кубов для рендеринга за 11 мс, хотя, возможно, вы сможете получить его еще быстрее, если у вас есть статическая сцена. Увидеть: SVO рендеринг: OpenGL или пользовательский рендерер?

Другая вещь, которую вы можете сделать, это LOD-сцена, то есть только визуализация того, что действительно необходимо. Вы действительно заинтересованы в вокселях, которые находятся далеко? Если они имеют субпиксельный размер, вы можете вместо этого визуализировать quad imposter.

Вопрос 2:

Рендеринг экземпляров, безусловно, является частью решения, как и VBO и VAO, но есть и другие средства, такие как отправка только координат и генерация фактической геометрии в геометрическом шейдере. Смотрите также http://sol.gfxile.net/instancing.html

Если у вас статичная сцена, вы можете увеличить производительность почти в 5 раз.

0
По вопросам рекламы [email protected]