创建巨大的低多边形地形
Creating Huge Low Poly Terrain
我正在 C++ 使用 GLFW 和 GLEW 开始一个新项目。
计划是拥有一个相当大的 Low Poly 地形。它 不会 随机生成,我打算在 Blender 中制作它。
我的问题是,我无法在 Blender 中创建 巨大 Low Poly 地形,因为程序变得非常慢地形具有的顶点数。我创建了一个 500m x 500m 的地形,并将其细分为 1000。这给了我 很多 个顶点,使程序无法使用。
创建巨大地形的最佳方法是什么?
我不确定我将如何创建地形块,因为我必须对它们进行建模。
- 如何创建一个大的 Low Poly 地形,而不会出现问题
程序运行缓慢?
我的另一个 问题显然是将世界加载到我的自定义游戏引擎中。我想像这样的大世界在加载时间方面会有很大的问题。
我多年前做过类似的事情,发现这个教程很有帮助:
http://www.rastertek.com/tertut05.html
它描述了创建一个四叉树,其中包含从您的地形网格划分为 AABB 的特定三角形,使用平截头体剔除可以在运行时剔除大部分地形,并且您的应用程序的性能应该会提高。只要您有信心导入从 Blender 导出的网格(它们在 .obj 中吗?)您应该能够使用本教程中概述的策略轻松地划分不同的三角形。
进一步的优化可能是根据与摄像机的距离为四叉树中的节点设置不同的 LOD,即,如果节点与摄像机的距离设定为一定距离,则通过跳过某些顶点来渲染较低的多边形网格以使较小的三角形 "collapse" 变成较大的三角形。我建议生成特定的索引列表来执行此操作并使用相同的顶点数据,而不是使用单独的预生成网格块来节省内存。
Unity、Unreal Engine 和 CryEngine 等游戏引擎中的地形与普通静态或骨架网格物体的处理方式不同。不同细节级别的创建通常在运行时完成,这与预先创建 LOD 的普通网格不同。从 Blender 或 3DS Max 等 3D 程序加载网格作为整个地形是不可行的。
rastertek 的 Direct3D 教程非常适合学习,但显然不是 OpenGL。这是在 Java OpenGL 中创建基本地形的基本教程(我不认为这不涉及 LOD 处理)。
最常见的是,我认为我见过一个四叉树系统,其中有地形块,每个块又细分为四个其他块,具体取决于条件(无论是与相机的距离还是屏幕空间大小)。
这是标准的四叉树 LOD 系统的样子,特别是对于游戏 Kerbal Space Program。
一路上你需要弄清楚如何解决一些问题,比如如何消除两个不同 LOD 级别的地形块之间的裂缝和缝隙。 Kerbal Space 程序通过以不同方式处理边缘顶点以对齐,并且不允许任何两个相邻地形块的差异超过一个 LOD 级别来解决此问题。
我尝试过的一种方法是为每个顶点上传两个顶点位置,当前LOD位置和LOD顶点的位置从一层向下,并根据相机距离在两者之间进行线性插值。但我很确定还有比这更优雅的方法。
我前段时间发了一段自己搞这玩意儿的视频,里面有基本的四叉树模式,裂缝的问题,还有顶点插值的方法。有些人在 CPU 上创建补丁,其他人在 GPU 上创建补丁,并使用变换反馈读回任何必要的信息(例如物理信息)。做事的方式有很多种,我希望能重新开始。
我正在 C++ 使用 GLFW 和 GLEW 开始一个新项目。
计划是拥有一个相当大的 Low Poly 地形。它 不会 随机生成,我打算在 Blender 中制作它。
我的问题是,我无法在 Blender 中创建 巨大 Low Poly 地形,因为程序变得非常慢地形具有的顶点数。我创建了一个 500m x 500m 的地形,并将其细分为 1000。这给了我 很多 个顶点,使程序无法使用。
创建巨大地形的最佳方法是什么? 我不确定我将如何创建地形块,因为我必须对它们进行建模。
- 如何创建一个大的 Low Poly 地形,而不会出现问题 程序运行缓慢?
我的另一个 问题显然是将世界加载到我的自定义游戏引擎中。我想像这样的大世界在加载时间方面会有很大的问题。
我多年前做过类似的事情,发现这个教程很有帮助:
http://www.rastertek.com/tertut05.html
它描述了创建一个四叉树,其中包含从您的地形网格划分为 AABB 的特定三角形,使用平截头体剔除可以在运行时剔除大部分地形,并且您的应用程序的性能应该会提高。只要您有信心导入从 Blender 导出的网格(它们在 .obj 中吗?)您应该能够使用本教程中概述的策略轻松地划分不同的三角形。
进一步的优化可能是根据与摄像机的距离为四叉树中的节点设置不同的 LOD,即,如果节点与摄像机的距离设定为一定距离,则通过跳过某些顶点来渲染较低的多边形网格以使较小的三角形 "collapse" 变成较大的三角形。我建议生成特定的索引列表来执行此操作并使用相同的顶点数据,而不是使用单独的预生成网格块来节省内存。
Unity、Unreal Engine 和 CryEngine 等游戏引擎中的地形与普通静态或骨架网格物体的处理方式不同。不同细节级别的创建通常在运行时完成,这与预先创建 LOD 的普通网格不同。从 Blender 或 3DS Max 等 3D 程序加载网格作为整个地形是不可行的。
rastertek 的 Direct3D 教程非常适合学习,但显然不是 OpenGL。这是在 Java OpenGL 中创建基本地形的基本教程(我不认为这不涉及 LOD 处理)。
最常见的是,我认为我见过一个四叉树系统,其中有地形块,每个块又细分为四个其他块,具体取决于条件(无论是与相机的距离还是屏幕空间大小)。
这是标准的四叉树 LOD 系统的样子,特别是对于游戏 Kerbal Space Program。
一路上你需要弄清楚如何解决一些问题,比如如何消除两个不同 LOD 级别的地形块之间的裂缝和缝隙。 Kerbal Space 程序通过以不同方式处理边缘顶点以对齐,并且不允许任何两个相邻地形块的差异超过一个 LOD 级别来解决此问题。
我尝试过的一种方法是为每个顶点上传两个顶点位置,当前LOD位置和LOD顶点的位置从一层向下,并根据相机距离在两者之间进行线性插值。但我很确定还有比这更优雅的方法。
我前段时间发了一段自己搞这玩意儿的视频,里面有基本的四叉树模式,裂缝的问题,还有顶点插值的方法。有些人在 CPU 上创建补丁,其他人在 GPU 上创建补丁,并使用变换反馈读回任何必要的信息(例如物理信息)。做事的方式有很多种,我希望能重新开始。