微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在运行时创建具有大量实例数的多网格

如何解决在运行时创建具有大量实例数的多网格

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

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

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

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

解决方法

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

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

如您所知,生成块的时间越长,体素越多。然而,只有一个体素的块会违背目的。因此,每个块必须有最佳数量的体素。 而且您可能正在研究它,您可以考虑让它可配置。每边 256 个体素的立方体是 16777216 个体素。尝试其他尺寸,当我尝试做这样的事情时,每边 64 个体素对我来说效果更好。


我不得不建议不要为每个立方体设置一个实例。如果您想使用网格来表示您的体素。我建议做网格。每个块都是一个网格。

体素网格通常与行进立方体交织在一起。 我觉得我必须提到它,即使你已经听过一百万次。我怀疑你想要那种行进生成的网格,因为它们看起来不像立方体。然而,行进立方体是一种网格体素的方法。您可以应用相同的方法,但您知道,生成一个看起来像立方体的网格。这个想法很简单,你遍历体素,然后根据体素数据构建一个网格,没有任何内表面。

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


我知道您可以在姊妹网站 gamedev.stackexchange.com 上找到更多信息。尝试搜索 "voxel meshing" 还有 marching cubes 是那里的标签!

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


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

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


附录:您尝试过 GridMaps 吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。