我真的需要 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)
,等等),因此该功能完全没有必要。
我正在阅读 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)
,等等),因此该功能完全没有必要。