对于统一缓冲区对象,我真的需要glBindBuffer吗



我正在阅读OpenGLWiki中关于绑定索引目标的部分。这让我有点困惑,所以我试着在网站上搜索glBindBufferglBindBufferBase之间的区别,在那里我找到了这个答案。

我想我能够完全理解链接中的答案(希望如此(,但仍然希望澄清在直接国家访问的情况下这将如何工作。具体地说,答案提到">glBindBuffer用于将缓冲区绑定到特定目标,以便所有修改该目标的操作随后都映射到该缓冲区";根据这个逻辑,如果我可以使用像glNamedBufferSubData这样的DSA调用来直接修改缓冲区,那么根本不需要使用glBindBuffer,如果我错了,请纠正我。

例如,如果我做这样的事情:

layout(std140, binding = 7) uniform Foo {
ivec2 bar1;
float bar2;
float baz1;
vec4 baz2[10];
} foo;
glCreateBuffers(1, &id);
glNamedBufferStorage(id, size, NULL, GL_DYNAMIC_STORAGE_BIT);
glBindBufferBase(target, 7, id);
... // on init, for each block member, query aligned offset, calculate size
while (every frame) {
... // prepare new buffer data
glNamedBufferSubData(id, offset, size, data);  // update data store
}

那么我根本不需要绑定/取消绑定缓冲区,这对UBO和SSBO都正确吗?最重要的是,它安全吗?

虽然如果您想使用对象进行渲染(尽管有时是间接的(,仍然需要绑定对象,但DSA特别不需要每次使用glBindBuffer。有其他方法可以完成绑定调用的有用部分(glVertexArrayElementBuffer代替glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)等(,因此该函数完全没有必要。

最新更新