首页 > 解决方案 > 在运行时创建具有大量实例数的多网格

问题描述

我目前正在发现 Godot,正在开发体素引擎,但在运行时创建多网格时遇到了问题。我的引擎是在 C++ 本机模块中编码的。

我将体素存储在块中,但具有比经典引擎更大的立方体数量(我想绘制小的彩色立方体而不是一个更大的纹理立方体)。所以我的块有 256 个立方体宽,每个用 multiMesh 绘制。

我遇到的问题是,当我在渲染世界中移动时,在生成新块时显示会滞后,因为多网格指令(set_instance_transform、set_visible_instance_count、set_instance_count ...)在可视服务器中处理,即使我运行线程中的每个块生成。

所以问题是如何在运行时为大量实例有效地创建多网格?(也许我的做法不对)

标签: godot

解决方案


这是我希望我知道的更多,但我会分享我所知道的。

首先,考虑让更多块可见,而不是具有更多体素的块。

如您所知,生成块所需的时间越长,体素越多。然而,拥有一个只有一个体素的块就达不到目的了。因此,每个块必须有最佳数量的体素。而且您可能正在检查它,您可能会考虑将其保留为可配置的。每边 256 个体素的立方体是 16777216 个体素。尝试其他尺寸,当我尝试做这样的事情时,每边 64 个体素对我来说效果更好。


我不得不建议不要为每个多维数据集创建一个实例。如果您想使用网格来表示您的体素。我建议进行网格划分。每个块都是一个网格。

体素网格划分通常与行进立方体交织在一起。我觉得我不得不提一下,即使你已经听过一百万次了。我怀疑你想要那种行进生成的网格,因为它们看起来不像立方体。然而,行进立方体是网格体素的一种方式。您可以应用相同的方法,除了生成看起来像立方体的网格。这个想法很简单,你迭代体素,然后从体素数据构造一个网格,没有任何内表面。


顺便说一句,另一种方法是光线投射。您可以将体素数据作为 3D 纹理上传到 GPU,并让着色器实现“快速体素遍历算法”或类似算法。它可以作为一种材料来实现,然后你的块就是简单的立方体。我已经取得了一些成功。

附录:优化是在每个空闲体素上存储到同一块中最近占用体素的距离。然后,当遍历时,您知道可以跳过前面的许多体素,而不管遍历的方向如何,这会使光线投射更快。

对于与体素立方体的面相对应的六个截头体中的每一个,您可以通过将与最近占用体素的距离存储在同一块上来进一步优化。然后对于遍历,您检查射线将是哪个平截头体,并告诉您要使用哪个值。但是,这开始减慢生成过程,因此您可能需要重新调整块大小。


我知道您可以在姐妹网站gamedev.stackexchange.com上找到更多信息。尝试搜索“voxel meshing”行进立方体是一个标签!

您可以找到的另一件事是体素的细节处理级别。对于远处的块,您可能并不真正想要所有这些细节。因此,您可以生成一个不太详细但计算速度更快的表示。


现在,由于问题是关于 Godot,我还要提到 Godot 有一个Asset Library不是资产商店,也不是店面,那里的一切都是免费的。像啤酒一样自由,像言论一样自由。您可以在 Godot 资源库上找到体素解决方案。即使你不打算使用它们,你也可以看看它们是如何工作的。因为,我提到了吗?它们都是免费软件。

我没有深入研究它们,但3D Voxel Demo声称使用另一个线程来创建网格。此外,他们推荐使用C++ 的godot_voxel 。实际上,它是体素的 Godot 模块。为什么不从那里开始?


附录:您尝试过 GridMaps 吗?


推荐阅读