任何人都可以建议一种快速、有效的方法来存储和访问稀疏八叉树吗?
最好是可以在 HLSL 中轻松实现的东西。(我正在使用光线投射/体素应用程序)
在这种情况下,可以预先计算树,所以我主要关心大小和搜索时间。
更新
对于任何想要这样做的人,更有效的解决方案可能是将节点存储为使用 Z 阶曲线/莫顿树生成的线性八叉树。这样做消除了内部节点的存储,但可能需要使用第二个“数据纹理”交叉引用线性树阵列,其中包含有关单个体素的信息。
任何人都可以建议一种快速、有效的方法来存储和访问稀疏八叉树吗?
最好是可以在 HLSL 中轻松实现的东西。(我正在使用光线投射/体素应用程序)
在这种情况下,可以预先计算树,所以我主要关心大小和搜索时间。
更新
对于任何想要这样做的人,更有效的解决方案可能是将节点存储为使用 Z 阶曲线/莫顿树生成的线性八叉树。这样做消除了内部节点的存储,但可能需要使用第二个“数据纹理”交叉引用线性树阵列,其中包含有关单个体素的信息。
我在 HLSL 不是很有经验,所以我不确定这是否能满足您的需求,这是我的想法。如果这里的某些东西不符合您的需求,请告诉我 - 我想讨论一下,也许我可以自己学习一些东西。
所以,首先,构建八叉树并用你的对象填充它。然后,只需遍历八叉树,将向量输出到内存缓冲区。
我认为 512x512 纹理可以容纳 5 级深(32,768 个节点)的完全打包的八叉树,每个包含 8 个对象。或者,一个完全打包的 4 级八叉树,每个八叉树有 64 个对象。
有一篇关于稀疏八叉树专注于 GPU 的精彩文章:Efficient Sparse Voxel Octrees – Analysis, Extensions, and Implementation