【问题标题】:Clarification about octrees and how they work in a Voxel world澄清八叉树及其在体素世界中的工作方式
【发布时间】:2013-06-05 04:58:56
【问题描述】:
我阅读了八叉树,但我并不完全了解它们是如何在体素世界中工作/实现的,在体素世界中,八叉树的目的是通过将重复体素连接到一个大“体素”来降低要渲染的体素数量。
以下是我想澄清的问题:
- 您将使用哪种类型的数据结构?如何将 3-D 体素数组转换为具有不同大小体素的数组,这些体素在数组中占据多个位置?
- 节点是什么,它们的用途是什么?
- 八叉树是否连接体素,所以只有方形,或者它可以是矩形或 L 形,或整个 Y 列的体素或什么?
- 八叉树真的能提高体素游戏的性能吗?如果是这样,通常是多少?
【问题讨论】:
标签:
opengl
lwjgl
voxel
octree
multidimensional-array
【解决方案1】:
快速回答:
- 一棵树:
每个节点有 8 个子节点,从上到左、从上到后到右等等,一直到一定程度
这方面的代码可能会变得相当复杂,尤其是在体素的情况下可以在运行时更改。
- 体素类型(颜色、材质、项目列表)
- 是的。仅限多维数据集
更具体地说是 1x1、2x2、4x4、8x8 等。它必须是一个完整的节点。
如果你真的想要,你可以定义某种模式,但它不再是八叉树。
- 是的,但这取决于您的数据。想象一下单独描述 256 个相同的块,或者描述一次(就像 Minecraft 中的空气)
我会首先尝试理解四叉树。你可以在纸上做,或者用它做一个测试程序。如果您进行实验,您将自己回答这些问题
【解决方案2】:
正确完成的八叉树还可以帮助您进行邻居搜索,这使您能够确定一张脸是否被认为是“可见的”(即,您最终会得到一个可见的体素外壳)。建立八叉树后,您可以使用它来存储 XYZ 坐标,然后将其提取到单个数组中。然后将此数组输入到您的 VERTEX 缓冲区(GL 解决方案需要此),然后您可以根据需要以块的形式渲染(随着相机向前移动等)。
Octree 也很自然地将立方体折叠成更大的立方体,如果有相同类型的立方体......就像俄罗斯方块一样,当你的颜色/形状相互“适合”时......这反过来可以减少你的顶点计数和渲染时,您实际上是在绘制正方形和矩形的组合
如果操作正确,您最终会得到很多只有在顶点缓冲区中可见的外向“面”的块。现在,您还必须构建自己的 Occlusion Culling 算法,然后降低其上的可见性,从而减少所需的渲染。
我在这里做了一个例子:
https://vimeo.com/71330826
注意到外部是如何被渲染的,但块本身会一直向下到底部,即使块深度面应该相互抵消? (需要更多优化)。还要注意相机是如何转动的,人脸是如何从渲染缓冲区中移除的?