在 openGL 中带有对象的静态背景。最好的"bake"方式?

Static background w/ objects in openGL. Best way to "bake"?

本文关键字:bake 方式 静态 openGL 对象 背景      更新时间:2023-10-16

我正在用openGL制作一个2D游戏,我有一个静态对象列表。到目前为止,我正在循环浏览它们并将它们拉入房间,但是在一些大房间中,它们多达 2000 个,速度至关重要,所以我想找到一种方法将它们"烘焙"在一起,并且永远不会在绘制循环中更新它们之后。

我该怎么做,在性能、内存使用情况、GPU RAM 使用情况等方面的最佳方法是什么?

我更喜欢使用 oGL 2,但我正在考虑 oGL 3+。

最简单的方法是将这些对象的所有数据移动到 GPU,以便渲染命令直接从 GPU 内存中获取内存。它可以通过简单地使用VBO甚至DisplayList(在"旧"OpenGL 2.0及更早版本中(来完成。

可能 DisplayList 解决方案将是最有效的,因为您可以将所有命令"打包"在里面......使用 VBO,您只能打包几何数据,需要每帧设置材料。相关主题:安装(但您必须使用 GL 3+(。

另一种方法是将它们渲染为纹理...并将它们显示为简单的精灵。这种技术被称为"冒名顶替者",这里有一些信息:真正的冒名顶替者。

另一种选择:将环境渲染为立方体地图。它可以适用于远离相机的物体(如山丘,尝试等(,但在房间里它可能看起来很奇怪。

第一种选择:为对象制作单个网格。例如,您可以使用可见的对象动态更新索引数组。在这种情况下,您使用的纹理应该在图集中非常重要。如果无法共享着色器和纹理,则此技术没有太大效果。您可以组合此方法,按材质对纹理进行分组,并使用单个绘制调用进行渲染。例如,第一次绘制调用 - 使用一种纹理渲染 100 棵树,然后在它们上渲染 600 个苹果,然后在 100 个云之后渲染。

另一种选择是,如果您的对象是静态的,您可以使用FBO将它们全部渲染为纹理。如果您的对象喜欢背景,则可以应用此功能。例如,在太空中为星系渲染随机恒星(1000(。