我找遍了所有地方,但找不到使用 DSA(直接状态访问)的。我需要一个具有动态大小的 SSBO,以便我可以更新我的实例,而不受 MAX_INSTANCE_COUNT 这样的限制。 目前我所做的是:
size_t datasize = 0;
void* data = nullptr;
unsigned int index = 0;
unsigned int id = 0;
glCreateBuffers(1, &id);
glNamedBufferStorage(id, datasize, data, GL_DYNAMIC_STORAGE_BIT);
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, index, id, 0, datasize);
然后在循环中我所做的是:
glNamedBufferData(id, (GLsizeiptr)datasize, data, GL_STREAM_DRAW);
我确实使用了“glNamedBufferSubData”,但这并不能真正让我超出数据大小。 如果您能逐步解释我如何做到这一点,我将非常感激。
OpenGL没有“动态存储”的概念。您可以使用
BufferData
为它们分配新的存储空间,但实际上不应该这样做。最好预先分配存储空间,如果超过该限制,要么生成错误,要么完全分配新的缓冲区。
此外,您不能在具有不可变存储的缓冲区上调用
BufferData
(由您对 BufferStorage
的调用创建的)。不可变存储缓冲区的全部要点是您不能重新分配它们。