我正在阅读OpenGLWiki中关于绑定索引目标的部分。这让我有点困惑,所以我试着在网站上搜索glBindBuffer
和glBindBufferBase
之间的区别,在那里我找到了这个答案。
我想我能够完全理解链接中的答案(希望如此(,但仍然希望澄清在直接国家访问的情况下这将如何工作。具体地说,答案提到">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)
等(,因此该函数完全没有必要。