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



因此,如果您已经使用glBindBuffer将缓冲区绑定(bind)到同一目标,那么glBindBufferRange对我来说似乎是多余的。

我正在阅读学习现代3D图形编程,并且chapter 7显示了如何制作统一的缓冲区对象。书中使用的代码:

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绑定(bind)到GL_UNIFORM_BUFFER绑定(bind)目标。链接到较早版本的文档还说:



这似乎触动了我的困惑,但我不理解这种解释。它说它解除了绑定(bind)到目标的绑定(bind),这似乎强化了我的(错误)想法,即事先不需要将缓冲区绑定(bind)到目标。

最佳答案

glBufferData 不仅会初始化缓冲区,还会创建具有指定大小的缓冲区对象的数据存储。您可以考虑一下它,就像c++中的内存分配一样。glBufferData为当前绑定(bind)到指定目标的缓冲区对象创建数据存储。在这种情况下,它为命名的缓冲区对象g_GlobalMatricesUBO创建数据存储,因为它已绑定(bind)到指定的目标GL_UNIFORM_BUFFER

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

关于c++ - 为什么必须同时使用glBindBuffer和glBindBufferRange在OpenGL中创建统一缓冲区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56537361/

10-15 16:47