稀疏体素八叉树(Sparse Voxel Octree)

  更新于
 magicavoxel

之前看到MagicaVoxel 相关的SVO(.rsvo文件)不知道是做什么用的。

搜索了相关内容得知这是Sparse Voxel Octree。在Voxel渲染器开发(1) | 从体素游戏到稀疏体素八叉树 (yemi.me)得知如下知识。(复制过来了)

将一个三维空间划分为八个子空间,不断细分下去直到每一个空间对应一个体素单元,存储上填充信息。当一个空间中没有填充的变化即全部填充或全部不填充时,不再细分存储数据,就可以得到一个稀疏的体素八叉树,将这些八叉树细分的Box绘制出来大概就长这样。

八叉树结构对比3D贴图的优势在于,对于空间中的空洞区域,八叉树结构是稀疏的不占用内存的空间。而3D贴图即使是大范围的空洞我们也需要预先分配存储空间。

从不同的角度对比稀疏体素八叉树和其他的数据模型。体素这种细节粒度细致的模型,就特别需要LOD系统来减少渲染的绘制开销。多边形网格的LOD实现要维护多套不同层级的Mesh。3D Texture采样的数据,LOD自然就是采样不同层级的Mipmap。而对于八叉树结构来说LOD采样同样直观,我们只需要减少Octree遍历的层级就可以实现八叉树的LOD。

同时体素数据不只是二值数据,还包含了材质信息。如果使用PBR渲染,我们需要储存包括体素颜色,粗糙度Roughness和金属度Metallic,以及自发光信息Emission。

对于多边形网格来说,这些数据可以直接存储在顶点数据中。而3D Texture的储存空间有限,ARGB32 只能存4个unorm,而刚才我们提到的参数有3+1+1+1=6个unorm。如果还要再考虑半透明材质的话就需要更多的空间存储。

八叉树的数据结构在GPU中实现时,是一个一维结构体数组,可以支持数据的扩展。

那么对于3D贴图有没有其他的方案呢?当然!类似于Deferred Texturing方案 我们可以只存储一个Material ID,再从材质数据的数组中查找对应的材质参数。这样我们就能获得理论上无限的Per Voxel数据空间。而且这个方案三种储存方式都可以使用。

总之体素八叉树是一个有较多优点的Voxel存储方案,由于空间大部分都是稀疏的没有体素填充,八叉树的存储空间会更小。

墨艺栈官方账号,社区管理员。
如未明确标明可商用请查证后使用!如需商业授权请自主联系版权方!

成为第一个回复的人

显示验证码
没有账号? 注册  忘记密码?
19
20
21
22
23
24
25
modal close image