Эффективное хранилище для разреженного дерева? - PullRequest
6 голосов
/ 22 мая 2011

Может ли кто-нибудь предложить fast , эффективный метод для хранения и доступа к разреженной октре?

Предпочтительно что-то, что может быть легко реализовано в HLSL.(Я работаю с приложением raycasting / voxel)

В этом случае дерево можно предварительно рассчитать, поэтому меня больше всего интересуют размер и время поиска.

Обновление

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

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Я не очень опытен в HLSL, поэтому я не уверен, что это удовлетворит ваши потребности, вот мои мысли. Дайте мне знать, если что-то здесь не подходит для ваших нужд - я бы хотел обсудить, так что, возможно, я смогу чему-то научиться сам.

  1. Каждый узел в октрее может существовать как вектор3, где компонент (x, y, z) представляет центральную точку узла. Компонент w может использоваться в качестве поля флагов. а. Поле w-flags может обозначать, какие дочерние узлы-октанты следуют за текущим узлом. Для этого потребуется 8 битов значения.
  2. Каждая сущность, хранящаяся в вашем октрее, может храниться как ограничивающий прямоугольник, где r, g, b могут быть размерами ограничивающего прямоугольника, а w может использоваться для любого.
  3. Определить специальный вектор, обозначающий, что список объектов следует. Например, если (w + z) является магическим значением. Некоторый func (x, y) может, скажем, быть числом объектов, которые следуют. Или все, что работает. а. За каждым узлом потенциально следует этот специальный вектор, указывающий, что в узле хранятся объекты. Следующие X-векторы - это просто идентификаторы объектов или что-то в этом роде. б. В качестве альтернативы, вы можете иметь один узел, который просто определяет список объектов в памяти. Опять же, вы не уверены, что вам здесь нужно или какие ограничения существуют для доступа к объектам.

Итак, во-первых, постройте октодерево и наполните его своими объектами. Затем просто пройдитесь по октри, выводя векторы в буфер памяти.

Я думаю, что текстура 512x512 может содержать полностью упакованный октрой глубиной 5 уровней (32 768 узлов), каждый из которых содержит 8 объектов. Или полностью упакованное 4-уровневое октри с 64 предметами в каждом.

1 голос
/ 26 мая 2011

Существует замечательная статья о разреженных октрях, посвященная графическим процессорам: Эффективные разреженные октановые числа октетов - анализ, расширения и реализация

...