如何创建动态大小的SSBO

问题描述 投票:0回答:1

我找遍了所有地方,但找不到使用 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”,但这并不能真正让我超出数据大小。 如果您能逐步解释我如何做到这一点,我将非常感激。

c++ opengl opengl-4
1个回答
0
投票

OpenGL没有“动态存储”的概念。您可以使用

BufferData
为它们分配新的存储空间,但实际上不应该这样做。最好预先分配存储空间,如果超过该限制,要么生成错误,要么完全分配新的缓冲区。

此外,您不能在具有不可变存储的缓冲区上调用

BufferData
(由您对
BufferStorage
的调用创建的)。不可变存储缓冲区的全部要点是您不能重新分配它们。

© www.soinside.com 2019 - 2024. All rights reserved.