为体素立方体景观优化网格


12

尝试在Unity 3D中创建我的世界/乐高世界风景(通过立方体程序生成的体素风景),我发现为这些风景创建的网格占用了大量内存。网格当前仅由多维数据集可见侧的顶点组成。复杂地形的内存使用可能需要6或700兆。

这些网格可以优化,但是我正在努力寻找一个合适的算法来做到这一点。

该算法必须考虑到您不希望“合并”具有不同地形类型的块。我想一个真正简单的开始可能是只处理一个轴上的所有块,并对其他两个轴进行额外的扫描。

我需要保持网格形状,即不要将顶点合并到更改空白或实体空间的位置。原因是,可能仍需要在网格周围导航的生物/等。因此,我不能只创建一个非常低的细节,扭曲的网格。

有任何想法/建议/提示吗?


2
为什么要为已知大小的多维数据集存储顶点?用算法去做;或使用共享的顶点缓冲区。
deceleratedcaviar

为什么选择多边形网格?体素可以像它们一样高效地渲染。对于一个体素立方体,您需要3个浮点数(x,y,z),对于1个框,您需要大约8 * 3个浮点数(8个顶点),并且如果您有隐式的边和多边形。也许Unity不是解决此体素问题的工具。
user712092 2011年

Answers:


5

我的问题是:

您为什么需要网格物体本身来进行生物运动?

您不能在ID的3D矩阵上进行路径计算吗?

我认为Minecraft使用3d矩阵和4位pr块。它还仅模拟玩家周围一定半径的生物。

您可以将块存储在oc-tree结构中,每个块都在其中压缩。

如果将压缩数据保留在RAM中,则可以在需要时相当快地对数据进行解压缩。

替代文字


我依靠的是在Unity中内置网格以进行冲突检测的方法,但是没有什么可以阻止我仅针对自定义数据结构测试冲突/路径。但是,我仍然需要创建一个可见的网格来显示地形,这是我需要优化的。
詹姆斯·利文斯顿,2010年

另一点...从屏幕截图中可以看到...没有很多平坦的地形。网格通常是立方体的粗糙表面,但我认为仍有一些空间可以优化网格面/顶点。似乎八叉树最适合具有大量相似数据块的数据,而不是“锯齿状”的数据。还是不正确?
James Livingston 2010年

@Gatorfrog:记住,空白也是数据。如果它是锯齿状的,那么可以肯定,会有很多信号表明它为空。八叉树就在那里,您可以在渲染前找出应该解压缩的块。空空间将只是一堆零。我的日常工作涉及使用非常复杂的体素渲染库。我的下一篇文章将描述他们的工作。
Nailer

我使用的库执行以下操作:创建数据块并将其存储在平面文件数据库中。每个块都有一个ID。每个多维数据集由许多块组成。为每个块创建一定数量的详细程度。在细节的最高级别具有100%的体素的情况下,第二高的细节具有所有体素的25%,然后为每个后续级别将其全部除以4。可以使用最高级别的细节来可视化靠近您的块。
Nailer

所有数据都以压缩形式从RAM传输到VRAM,并通过CUDA中运行的GPGPU压缩算法对其进行膨胀。这样可以节省大量的内存带宽。因此:在播放器所在的位置,并获得较高级别的细节块,可以使用较低的LOD之一轻松查看最远的东西。
Nailer

1

使用八叉树存储地形怎么样?

例如,空气=无节点,所有其他地形类型将具有一个具有该地形类型的节点。

插入/删除节点时,可以检查修改后的树路径上每个节点的所有八个子级是否都具有相同的梯形类型,并在需要时合并它们。这样,相同材质的大块将仅占据一个节点。


0

您是否仅为播放器可以看到的部分几何图形创建立方体?那将是我的第一步。根据您地形的大小,您不必加载/绘制/显示/显示任何内容。


我只是为旁边有空的立方体的侧面创建网格。至于没有绘制玩家看不见的网格...我曾考虑过排除任何没有可见块的块,例如地下洞穴或成一定角度进入地面的洞。但是,在那一点上,我绝对不能依靠我的网格进行碰撞/路径转换。
詹姆斯·利文斯顿,2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.