要在OpenGL中创建统一的缓冲区对象,为什么必须同时调用glBindBuffer和glBindBufferRange?据文档称,
将glBindBufferRange看作是将缓冲区绑定到两个位置:特定索引和目标。glBindBuffer只绑定到目标,而不是索引。
因此,如果您已经使用glBindBuffer将缓冲区绑定到相同的目标,那么glBindBufferRange对我来说就显得多余了。
我正在阅读学习现代三维图形编程和第七章演示如何制作统一的缓冲对象。这本书中使用的代码:
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时,您会认真考虑使用缓冲区,而不是仅仅修改它。
这似乎触及了我困惑的地方,但我不明白这个解释。它说它解除了以前绑定到目标的任何东西,这似乎强化了我(错误)的观点,即预先将缓冲区绑定到目标是不必要的。
发布于 2019-06-11 06:40:17
glBufferData不仅初始化缓冲区,还创建具有指定大小的缓冲区对象的数据存储。您可以将其视为c++中的内存分配。
glBufferData为当前绑定到指定目标的缓冲区对象创建数据存储区。在本例中,它为命名缓冲区对象g_GlobalMatricesUBO创建数据存储,因为它绑定到指定的目标GL_UNIFORM_BUFFER。
glBindBufferRange不创建任何数据存储,它使用必须存在的数据存储。具有数据存储的缓冲区对象由第三个参数指定。
https://stackoverflow.com/questions/56537361
复制相似问题