OpenGL 更新不同大小的 VBO 数据

Posted

技术标签:

【中文标题】OpenGL 更新不同大小的 VBO 数据【英文标题】:OpenGL Updating VBO Data with a different size 【发布时间】:2014-02-16 18:13:20 【问题描述】:

我正在使用 OpenGL 在屏幕上显示来自位图字体的文本,我正在为顶点创建一个 VBO,另一个用于索引,一个用于 UV。

我得到一个字符串值,然后从所有字符创建一个顶点、uv 和索引数据,所以我只有 1 个绘图调用。

现在我想弄清楚当该字符串发生变化时该怎么做。 如果和前面的字符串长度一样,我可以使用glBufferData()glBufferSubData(),但是如果大小不同怎么办?

我可以绑定 VBO,调用不同大小的 glBufferData() 并上传新数据吗? 还是我应该删除 VBO 并创建一个新的?

处理这个问题的正确方法是什么?

【问题讨论】:

没有唯一正确的方法。您可以创建一个具有新大小的新缓冲区(最好使用空指针使旧缓冲区无效),或者您可以从头开始创建一个更大的缓冲区并映射子范围,这样就无需驱动程序进行分配。可以对一个大缓冲区的子范围进行非同步映射,并且可以从 COPY_READ_BUFFER 目标的某些子范围复制缓冲区到实际缓冲区。每个作品。更复杂的方法会更快一些,但很可能没有太大区别。 【参考方案1】:

分配比您需要的更大的缓冲区并映射子范围,这样驱动程序就不必在每次字符串更改时重新分配内存。

【讨论】:

以上是关于OpenGL 更新不同大小的 VBO 数据的主要内容,如果未能解决你的问题,请参考以下文章

更新 openGL VBO

Open GL:多线程 glFlushMappedBufferRange?

OpenGL 使用单个 VBO 渲染多个对象,并使用另一个 VBO 更新对象的矩阵

为不同的 VBO 使用 OpenGL VAO

OpenGL中的动态VBO

慢跑。 OpenGL。如何更新 VBO?