【问题标题】:Efficient storage for a sparse octree?稀疏八叉树的有效存储?
【发布时间】:2011-05-22 00:06:08
【问题描述】:

谁能推荐一种快速有效的方法来存储和访问稀疏八叉树?

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

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

更新

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

【问题讨论】:

  • 你说的稀疏,是指3D空间很大,只有几个,小物件?
  • @Kevin 是的。比如说,一个 (2^10)^3 (1GB) 个元素的立方体大小,大概是 20% 左右。
  • 那么它和普通的八叉树有什么不同吗?抱歉,我熟悉四叉树和八叉树,但稀疏八叉树对我来说听起来很新鲜。
  • 它与普通的八叉树并没有什么不同,只是我需要尽可能地压缩它,而不是真正地压缩它。这必须存在于资源非常有限的 GPU 上的纹理中。

标签: c# xna hlsl sparse-array octree


【解决方案1】:

我在 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 个对象。

【讨论】:

  • 通过假设根节点是一个单位立方体,使用 .a 表示内部、叶子或空,并在 .r 中为内部节点存储第一个子节点的偏移量,我能够得到这降低到每个八叉树节点 1 个纹素。这让我可以在 DX9 中以最大 4K x 4K 2D 纹理大小放置一些非常深的树。使子节点保持特定顺序并利用隐含的边界框确实很有帮助。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2020-10-12
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多