我正在用 openGL 制作一个 2D 游戏,并且我有一个静态对象列表。到目前为止,我正在遍历它们并将它们拉进房间,但是在一些大房间里,它们多达 2000 个,速度很关键,所以我想找到一种方法将它们全部“烘烤”在一起,永远不要更新之后他们在绘制循环中。
我该怎么做?就性能、内存使用、gpu ram 使用等而言,最好的方法是什么?
我更喜欢使用 oGL 2,但我正在考虑使用 oGL 3+。
最简单的方法是将这些对象的所有数据移动到 GPU,以便渲染命令直接从 GPU 内存中获取内存。它可以通过简单地使用 VBO 甚至 DisplayList 来完成(在“旧”OpenGL 2.0 及之前的版本中)。
可能 DisplayList 解决方案将是最有效的,因为您可以“打包”里面的所有命令……使用 VBO,您只能打包几何数据,每帧都需要设置材料。相关主题:instacing(但您必须使用 GL 3+)。
另一种方法是将它们渲染为纹理......并将它们显示为简单的 Sprits。这种技术被称为“冒名顶替者”,这里有一些信息:真正的冒名顶替者。
另一种选择:将环境渲染到 Cube Map。它可以适用于远离相机的物体(如山丘、山丘等),但在房间里它可能看起来很奇怪。
第一个选项:为对象制作单个网格。例如,您可以使用可见的对象动态更新索引数组。在这种情况下,您使用的纹理应该在atlas中非常重要。如果您不能共享着色器和纹理,则此技术不会产生太大影响。您可以组合此方法,按材质对纹理进行分组,并使用单个绘制调用进行渲染。例如,第一次绘制调用 - 用一个纹理渲染 100 棵树,然后在它们上渲染 600 个苹果,然后在 100 朵云之后渲染。
另一种选择,如果您的对象是静态的,您可以使用 FBO 将它们全部渲染为纹理。如果您的对象喜欢背景,这可能会被应用。例如,您在太空中为您的星系渲染随机星星 (1000)。