Самый простой способ визуализации 10 000 затененных блоков в 3D - PullRequest
0 голосов
/ 30 июня 2011

У меня есть простое задание: у меня есть 10000 3D-блоков, каждый с топором, y, z, шириной, высотой, глубиной, вращением и цветом.Я хочу бросить их в трехмерное пространство, визуализировать его и позволить пользователю пролетать через него с помощью мыши.Есть ли простой способ собрать это вместе?

1 Ответ

3 голосов
/ 01 июля 2011

Один простой способ сделать это с использованием недавнего (v 3.2) OpenGL:

  • сделать массив из 8 вершин (углов куба), дать им координаты на единичном кубе, то есть от (-1, -1, -1) до (1, 1, 1)
  • создать объект буфера вершин
  • используйте glBufferData, чтобы получить ваш массив в буфер вершин
  • связать буфер вершин
  • создавать, настраивать и связывать любые текстуры, которые вы можете использовать (пропустите это, если вы не используете текстуры)
  • создать вершинный шейдер, который применяет матрицу преобразования, которая считывается из «некоторого источника» (см. Ниже) в соответствии со значением gl_InstanceID
  • скомпилировать шейдер, связать программу, связать программу
  • настроить данные преобразования экземпляра (см. Ниже) для всех экземпляров куба
  • в зависимости от того, какой метод вы используете для передачи данных преобразования, вы можете нарисовать все в одном пакете или использовать несколько пакетов
  • вызов glDrawElementsInstanced N количество раз с count, установленным на столько элементов, сколько уместится в одну партию
  • если вы используете несколько пакетов, обновите данные преобразования между
  • вершинный шейдер применяет преобразование в дополнение к обычному материалу MVP

Для передачи данных преобразования для каждого куба у вас есть несколько альтернатив, среди которых:

  • объекты единого буфера , у вас есть гарантированный минимум из 4096 значений, соответственно 256 матриц 4x4, но вы можете запросить фактическое значение
  • объекты текстурного буфера , опять же у вас есть гарантированный минимум 65536 значений, соответственно 4096 матриц 4x4 (но обычно что-то намного больше, моя старая карта может принимать 128 000 000 значений, вам следует запросить фактическое значение)
  • Устанавливать униформу вручную для каждого пакета, для этого не нужно никаких «буферных» вещей, но, скорее всего, это немного медленнее

В качестве альтернативы: Используйте псевдо-инстансинг , который будет работать даже на оборудовании, которое не поддерживает инстансинг напрямую. Это не так элегантно и немного медленнее, но делает работу.

...