Эффективное хранение для разреженного octree?

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

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

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

обновление

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

2 ответов


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

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

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

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


есть большая статья о разреженных octrees ориентируясь на GPU: эффективный разреженный воксельный Octrees-анализ, расширения и реализация