首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么必须同时使用glBindBuffer和glBindBufferRange在OpenGL中创建一个统一的缓冲区?

为什么必须同时使用glBindBuffer和glBindBufferRange在OpenGL中创建一个统一的缓冲区?
EN

Stack Overflow用户
提问于 2019-06-11 05:58:34
回答 1查看 1.8K关注 0票数 3

要在OpenGL中创建统一的缓冲区对象,为什么必须同时调用glBindBufferglBindBufferRange?据文档称,

将glBindBufferRange看作是将缓冲区绑定到两个位置:特定索引和目标​。glBindBuffer只绑定到目标​,而不是索引。

因此,如果您已经使用glBindBuffer将缓冲区绑定到相同的目标,那么glBindBufferRange对我来说就显得多余了。

我正在阅读学习现代三维图形编程和第七章演示如何制作统一的缓冲对象。这本书中使用的代码:

代码语言:javascript
复制
glGenBuffers(1, &g_GlobalMatricesUBO);
glBindBuffer(GL_UNIFORM_BUFFER, g_GlobalMatricesUBO);
glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4) * 2, NULL, GL_STREAM_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);

glBindBufferRange(GL_UNIFORM_BUFFER, g_iGlobalMatricesBindingIndex, g_GlobalMatricesUBO, 0, sizeof(glm::mat4) * 2);

这段代码可以工作,直到我注释掉对glBufferData的调用,在这种情况下,我会得到一个黑色的屏幕。这让我感到惊讶,因为之后我们将g_GlobalMatricesUBO绑定到GL_UNIFORM_BUFFER绑定目标。与前面的文件有关的文件还说:

请注意,这并不能用glBindBuffer替换标准缓冲区绑定。实际上,它将缓冲区绑定到目标​参数,从而解除绑定任何绑定到该目标的内容。但是通常在使用glBindBufferRange时,您会认真考虑使用缓冲区,而不是仅仅修改它。

这似乎触及了我困惑的地方,但我不明白这个解释。它说它解除了以前绑定到目标的任何东西,这似乎强化了我(错误)的观点,即预先将缓冲区绑定到目标是不必要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 06:40:17

glBufferData不仅初始化缓冲区,还创建具有指定大小的缓冲区对象的数据存储。您可以将其视为c++中的内存分配。

glBufferData为当前绑定到指定目标的缓冲区对象创建数据存储区。在本例中,它为命名缓冲区对象g_GlobalMatricesUBO创建数据存储,因为它绑定到指定的目标GL_UNIFORM_BUFFER

glBindBufferRange不创建任何数据存储,它使用必须存在的数据存储。具有数据存储的缓冲区对象由第三个参数指定。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56537361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档