我现在正在尝试使用 C++、OpenGL 和 GLSL(用于 GPU 加速)来实现 Ray Casting Volume Rendering。为了获得更好的质量和性能,我想用八叉树来组织3D医学体数据,这样我就可以很容易地使用一些算法,比如空间跳跃和自适应采样。
但是如何有效地构建八叉树呢?如何参观八叉树?当光线在体数据中传播时,如何确定采样点属于八叉树的哪个单元或叶?
这里有一篇关于 GPU octree 的优秀文章(这里也有可用的源代码)。然而,它是基于 Cg 的,但这可以被认为是一个优势。
看到您正在使用医疗数据,而且数据更密集,您可能还对Cyril Crassin 的博士论文感兴趣,该论文使用流 GPU 稀疏八叉树来组织密集体素数据。在这里,八叉树是在 GPU 上构建的,使用 3D 体积纹理用于数据存储(叶节点)和用于分配内部节点的砖池,从底部向上构建,然后通过 mip-map'ed 进行光线投射。
如果你愿意弯曲一点,有一个关于使用 CUDA的稀疏体素八叉树的大项目,这将为稀疏八叉树和光线投射提供有价值的见解。