在 openGL 中带有对象的静态背景。最好的"bake"方式?
Static background w/ objects in openGL. Best way to "bake"?
我正在用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(。
- 如何在c++中为模板函数实例创建快捷方式
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 重载方法的方式会在使用临时调用时生成编译器错误
- 在reactor中存储eventHandlers的最佳方式是什么
- 如何以优化的方式同时迭代两个间距不相等的数组
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 为什么C++有不同的变量初始化方式?
- 在AVX通道中混洗的最佳方式
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 如何以静态代码分析友好的方式使用 #define 防护?
- 在 openGL 中带有对象的静态背景。最好的"bake"方式?