Я пытаюсь создать сетку 600x600x600, содержащую единичные кубы (или сферы). Только некоторые из кубиков присутствуют. Итак, в основном я пытаюсь сделать что-то вроде следующего, составленного из маленьких кубиков или сфер.
Вопрос 1Предоставление такой структуры является дорогостоящим. Требуется 3 вложенных цикла (каждая из 600 итераций). Есть ли способ справиться с этим?
Я подумал о том, чтобы объединить соседние кубы в один (окт-деревья), так как в моем случае не будет слишком много пробелов. Но я хочу общее решение этого. Как вы думаете, сколько времени потребовалось бы для рендеринга такой сцены выше (похоже на сцену размером 250x250x250)?
вопрос 2: Рендеринг экземпляра связан с моей проблемой?
ЗаметкаЗдесь я представляю воксель как куб, которому, в свою очередь, нужно 6 квадов.
Я делал воксельные рендеринг движки в прошлом. Вот несколько быстрых оптимизаций, которые я могу предложить, которые дадут вам хороший прирост скорости:
Если все сделано правильно, эти три вещи дадут вам большую часть того ускорения, которое вы ищете. После этого все его настройки в соответствии с вашими потребностями и требованиями.
Действительно, проблема 1 может быть решена путем объединения различных кубов в один большой куб. Двигатели Voxel часто группируют несколько отдельных блоков в куски. Это, пожалуй, лучший путь.
Во-вторых, вы можете использовать логическую переменную для каждого вокселя, а также для чанка, содержащего эти воксели, и установить 1 для рендеринга или 0 в противном случае.
Вам потребуются класс вокселей, класс чанков и некоторые другие абстракции в зависимости от ваших требований.
Возможно, создадим геометрический шейдер, который будет копировать блок для каждой точки сетки. Запрограммируйте интеллектуальный шейдер так, чтобы он не выводил стороны, отвернутые от вида, и стороны, где рядом находится «активная» коробка.
Задача состоит в том, чтобы предоставить геометрическому шейдеру булевы значения размером 600 * 600 * 600. Если составной «объект» несколько тверд, возможно, вам нужно только указать начальную и конечную позиции в каждой строке / столбце кубов, поэтому: 1,4,90,345 означает заполнить позиции от 1 до 4 и от 90 до 345 кубиками.
Вопрос 1:
Я не знаю, как у вас получается рендерить 3 вложенных цикла. Я вижу одну огромную петлю с 600 ^ 3 вокселями. Последнее, что вы хотите сделать, это визуализировать каждый воксель по отдельности, поскольку ваш графический процессор является потоковым многоядерным процессором, а ваши данные практически одинаковы, за исключением перевода в пространстве. Чтобы быть справедливым, это число, вероятно, слишком велико для начала. В настоящее время требуется около 64 000 кубов для рендеринга за 11 мс, хотя, возможно, вы сможете получить его еще быстрее, если у вас есть статическая сцена. Увидеть: SVO рендеринг: OpenGL или пользовательский рендерер?
Другая вещь, которую вы можете сделать, это LOD-сцена, то есть только визуализация того, что действительно необходимо. Вы действительно заинтересованы в вокселях, которые находятся далеко? Если они имеют субпиксельный размер, вы можете вместо этого визуализировать quad imposter.
Вопрос 2:
Рендеринг экземпляров, безусловно, является частью решения, как и VBO и VAO, но есть и другие средства, такие как отправка только координат и генерация фактической геометрии в геометрическом шейдере. Смотрите также http://sol.gfxile.net/instancing.html
Если у вас статичная сцена, вы можете увеличить производительность почти в 5 раз.