c++ - 如何管理和组织动态和静态几何

标签 c++ opengl vbo

我需要一些关于如何在 opengl 中处理不同几何图形(静态、动态)的指南。

我正在尝试开发一个图形引擎(作为学习),我对 opengl 有一些了解(我做过一些事情),我需要问一些 google 没有回复的问题:

1 - 将所有几何数据存储在 vbo 中以便稍后绘制的正确方法是什么。我如何将这些数据组织到 vbo 中?我认为:

全部分开

->静态和动态数据

2 - 请记住,世界上有不同类型的 3d 几何图形,静态的、动态的等等,哪种是处理它们的最佳方式?动态元素应该每个都有自己的 vbo 和 ibo,因为它们每帧都会更新,但应该处理静态元素?

假设游戏世界由 3 个静态立方体(具有相同纹理)、5 个静态圆锥体(每个具有不同纹理)、5 个动态角色(3d 模型各不相同,并且在每一帧中变化)和 8 个 3d静态模型(所有模型都是不同的)。你如何使用 vbo 组织这些几何图形??

我不关心顶点缓冲对象的使用(我知道),我喜欢你如何使用 vbo 对每个元素进行分组:

即:3 个立方体放在同一个 vbo 中,5 个圆锥体放在其他分开的 vbo 中,等等

最佳答案

  • 如前所述将动态和静态可绘制数组分开(GL_STATIC_DRAWGL_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/

相关文章:

c++ - llvm::make_unique 的目的是什么?

opengl - 如何判断 OpenGL 上下文是否是硬件加速的?

c++ - 使用 glDrawArrays() 时如何获取 VBO 的长度以渲染所有顶点?

java - 如何将元素映射到 OpenGL VBO 中的颜色?

c++ - 使用纹理、法线和索引列表从 VBO 绘制 OpenGL 对象的问题

c++ - "Magick++::readImages"当我调用它来解码 Blob 对象中的 png 图像时抛出警告

c++ - 有没有办法从 C++ 中的枚举类中获取随机数?

c++ - 在 C++ 中初始化指针数组

opengl - 组合实例 VBO 是个好主意吗?

c++ - 我可以禁用 OpenGL 中的自动错误处理吗?