OpenGL:推荐对VBO进行大量编辑的方法
OpenGL: recommended way of making lots of edits to VBO
这个问题有两个(大部分)独立的部分
我目前的设置是我在游戏空间中有很多Object
。 每个顶点都分配有一个 VBO,其中包含每个顶点的顶点属性数据。 如果Object
想要更改其顶点数据(位置等),它会在内部数组中执行此操作,然后调用glBufferSubDataARB
更新 GPU 中的版本。
现在我明白这是一件可怕的事情,所以我正在寻找替代方案。 一个呈现自己的是有一些管理的东西,它在开始时有一个大的 VBO,Object
可以从中请求空间,并在其中编辑点。 这降低了加载 VBO 的开销,但在创建和调试这样一个野兽(基本上是一个完整的内存管理系统)时会产生大量的精力/时间支出。
我的问题((a)部分)是,这是否是执行此操作的"最佳"方法,或者是否有我没有想到的更好的方法。
这样的系统应该允许尽可能快地轻松添加/删除顶点并进行编辑。
(b)部分是关于对每个物体采取的一些简单动作,即旋转和平移。 目前我正在移动每个顶点(哎哟),但这必须有更好的选择。 我正在考虑将旋转和平移矩阵上传到我的着色器以在那里进行。 这似乎很好,但我有点担心更改uniform
变量的开销。 这样做最终对我有利吗? 更改uniform
变量的速度有多快?
上次我检查进行缓冲区更新的首选方法是孤立。基本上,每当要更新缓冲数据时,都会在缓冲区上调用glBindBuffer
,这会使缓冲区的当前内容无效,然后使用 glMapBuffer
/glBufferSubdata
写入新数据。
因此:
- 为您的静态数据使用单个大的 VBO 确实是一个好主意。您必须注意允许的最大 VBO 大小,并在必要时将静态数据拆分为多个 VCO。但在大多数情况下,这可能是过度优化(即"我不会打扰")。
- 经常更新的数据应分组在同一 VBO 中(使用 =
GL_STREAM_DRAW
),并且您应该使用孤立来更新它。
不幸的是,这些东西的实际性能在不同的实现中有所不同。这家伙在实际游戏中做了一些测试,可能值得一读。
对于问题的第二部分,显然使用制服是这样做的方法。是的,有一些(小)开销,但它肯定比在每一帧流式传输所有数据要好 1000 倍。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 如何将按钮添加到节点的属性编辑器面板,该面板调用该节点内的方法?
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 如果要调用多个成员函数,对象编辑器是否是一种好方法?
- 删除/编辑 ATL COM DLL 属性/方法
- 保存“编辑控件”用户输入并在应用程序重新启动C++Visual Studio时进行恢复的有效方法
- 有没有一种方法可以在linux中编辑windows C++exe文件
- 已编辑:访问正在运行的 C++ 程序中的方法
- C++ 编程(由 ref 和 by val 的优势)查询?/ 编辑 byRef 以外的结构的方法
- OpenGL:推荐对VBO进行大量编辑的方法
- 无法通过 get 方法编辑私有变量(必须是可修改的左值)
- 为文本编辑控件实现缓冲区的最佳方法是什么?
- 一种在Windows中用C++编辑(读/写文本)现有.doc(MS Word)文件的方法
- qt4:覆盖UI编辑器创建的小部件的事件处理程序方法
- 将成员方法声明列表获取到文本编辑器中
- 使用OpenGL和Qt构建3d编辑器,我使用哪些方法/shell