我需要一些关于如何在 opengl 中处理不同几何图形(静态、动态)的指南。
我正在尝试开发一个图形引擎(作为学习),我对 opengl 有一些了解(我做过一些事情),我需要问一些 google 没有回复的问题:
1 - 将所有几何数据存储在 vbo 中以便稍后绘制的正确方法是什么。我如何将这些数据组织到 vbo 中?我认为:
全部分开
->静态和动态数据
2 - 请记住,世界上有不同类型的 3d 几何图形,静态的、动态的等等,哪种是处理它们的最佳方式?动态元素应该每个都有自己的 vbo 和 ibo,因为它们每帧都会更新,但应该处理静态元素?
假设游戏世界由 3 个静态立方体(具有相同纹理)、5 个静态圆锥体(每个具有不同纹理)、5 个动态角色(3d 模型各不相同,并且在每一帧中变化)和 8 个 3d静态模型(所有模型都是不同的)。你如何使用 vbo 组织这些几何图形??
我不关心顶点缓冲对象的使用(我知道),我喜欢你如何使用 vbo 对每个元素进行分组:
即:3 个立方体放在同一个 vbo 中,5 个圆锥体放在其他分开的 vbo 中,等等
最佳答案
- 如前所述将动态和静态可绘制数组分开(
GL_STATIC_DRAW
和GL_DYNAMIC_DRAW
数据提示,每个缓冲区) - 使用
GL_TRIANGLE_STRIP
获得最佳顶点吞吐量 - 可以对具有大量共享顶点的几何体使用元素数组缓冲区,例如
GL_TRIANGLE_STRIP_ADJACENCY
用于几何着色器。这可以节省内存带宽和/或 GPU 时间(顶点着色器阶段可能只处理一次共享顶点) - 每个模型都可能存在 VBO,作为后期优化,可以在每个数据生命周期和世界分区的基础上分配 VBO。
- 首先,您可以实现两个简单的案例:
- 静态可绘制模型
- 动态绘图模型
- 但是,请确保您的数据处理足够抽象,可以轻松更改和扩展。
- 关于性能的最近被问到的问题,欲了解更多信息:Does interleaving in VBOs speed up performance when using VAOs
关于c++ - 如何管理和组织动态和静态几何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20012392/