OpenGL: рендеринг большого количества кубов

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

3D-теневой корпус

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

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

Вопрос 2. Отрисовка экземпляра связана с моей проблемой?

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


person Shashwat    schedule 08.04.2014    source источник


Ответы (4)


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

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

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

person GlGuru    schedule 19.09.2014

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

person Beowulf    schedule 08.04.2014
comment
У меня есть вся структура класса. Основная проблема — повторение. Объединение кубов не будет работать, если у вас есть структура шахматной доски (когда ни один куб не является смежным с любым другим кубом). У вас есть какое-то общее решение? Какие-нибудь изменения в шейдере и все такое? Кроме того, можно ли хранить логические переменные размером 600x600x600. - person Shashwat; 09.04.2014
comment
Структура шахматной доски делает вещи довольно сложными. Я еще не придумал правдоподобного ответа. Хотя вы можете попробовать sites.google.com/site/letsmakeavoxelengine/home для некоторых ссылок. . - person Beowulf; 09.04.2014

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

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

person Plarsen    schedule 09.04.2014

Вопрос 1:

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

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

Вопрос 2:

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

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

person StarShine    schedule 19.09.2014