稀疏八叉树的高效存储?

时间:2011-05-22 00:06:08

标签: c# xna hlsl sparse-array octree

有人可以建议 快速 ,这是一种存储和访问稀疏八叉树的有效方法吗?

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

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

更新

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

2 个答案:

答案 0 :(得分:2)

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

  1. 八叉树中的每个节点都可以作为vector3存在,其中(x,y,z)分量表示节点的中心点。 w组件可以用作标志字段。 一个。 w-flags字段可以表示哪个八分圆子节点跟随当前节点。这将需要8位的值。
  2. 存储在八叉树中的每个实体都可以存储为边界框,其中r,g,b可以是边界框尺寸,w可以用于任何内容。
  3. 定义一个特殊向量,表示对象列表如下。例如,如果(w + z)是一些神奇的值。例如,某些func(x,y)可以是后面的对象数。或者,无论有效。 一个。每个节点后面都可能跟有此特殊向量,表示存在节点中存在对象。接下来的X向量都只是对象标识符或类似的东西。 湾或者,您可以拥有一个仅指定内存中对象列表的节点。同样,不确定这里需要什么或者如何访问对象的限制。
  4. 因此,首先,构建八叉树并将其与对象一起填充。然后,只需走八叉树,将向量输出到内存缓冲区。

    我认为512x512纹理可以容纳5级深度(32,768个节点)的完全打包的八叉树,每个包含8个对象。或者,一个完全打包的4级八叉树,每个都有64个对象。

答案 1 :(得分:1)

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