我真的需要 glBindBuffer 作为统一缓冲对象吗?

Do I really need glBindBuffer for uniform buffer objects?

我正在阅读 OpenGL wiki. That's a bit confusing to me, so I tried to search the difference between glBindBuffer and glBindBufferBase on the site, where I found 中有关 绑定索引目标 的部分。

我认为我能够完全理解 link 中的答案(希望如此),但仍需要澄清它在直接状态访问的上下文中如何工作。具体来说,答案提到“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
}

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

虽然您仍然需要绑定对象来渲染它们(尽管有时是间接的),但 DSA 使得每次使用 glBindBuffer 都是特别不必要的。有其他方法可以完成该绑定调用的有用部分(glVertexArrayElementBuffer 替换 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER),等等),因此该功能完全没有必要。