6

任何人都可以建议一种快速、有效的方法来存储和访问稀疏八叉树吗?

最好是可以在 HLSL 中轻松实现的东西。(我正在使用光线投射/体素应用程序)

在这种情况下,可以预先计算树,所以我主要关心大小和搜索时间。

更新

对于任何想要这样做的人,更有效的解决方案可能是将节点存储为使用 Z 阶曲线/莫顿树生成的线性八叉树。这样做消除了内部节点的存储,但可能需要使用第二个“数据纹理”交叉引用线性树阵列,其中包含有关单个体素的信息。

4

2 回答 2

2

我在 HLSL 不是很有经验,所以我不确定这是否能满足您的需求,这是我的想法。如果这里的某些东西不符合您的需求,请告诉我 - 我想讨论一下,也许我可以自己学习一些东西。

  1. 八叉树中的每个节点都可以作为向量存在,其中 (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 个对象。

于 2011-05-24T16:37:51.297 回答
2

有一篇关于稀疏八叉树专注于 GPU 的精彩文章:Efficient Sparse Voxel Octrees – Analysis, Extensions, and Implementation

于 2011-05-25T20:35:33.623 回答