从 GL 计算着色器读取后释放缓冲区

Deallocate buffer after reading from GL compute shader

我有一个 GPU 实现的 Marching Cubes,它使用一系列 6 个 GL 计算着色器,在适当的内存屏障之后,每次都从先前着色器写入的缓冲区中读取数据。早期阶段使用的缓冲区保存临时标记变量,不再需要时应将其大小调整为 0,但不要删除,因为我会在以后的运行中再次使用它们。

在某些阶段,我需要从着色器中的缓冲区读取,然后在着色器完成后立即释放它,然后再为下一个着色器阶段分配缓冲区。我的问题是如何安全地做到这一点。内存屏障文档讨论了确保在允许另一个着色器读取之前完成所有写入,但没有提及第一个着色器中的读取。

如果我这样做:

glUseProgram(firstShader);
glDispatchCompute(size,1,1);
glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
glNamedBufferData(firstBuffer,0,NULL,GL_DYNAMIC_DRAW);
glNamedBufferData(secondBuffer,1000000,&data,GL_DYNAMIC_DRAW);
glUseProgram(secondShader);
glDispatchCompute(size,1,1);

是否保证 firstBufferfirstShader 完成读取之前不会调整大小?如果没有,我该如何实现?

and should be resized to 0 when no longer needed, but not deleted as I'll want them again for later runs.

调整缓冲区大小等同于删除它并在相同的 id 上分配一个新缓冲区。

In some stages, I need to read from a buffer in a shader then deallocate it immediately after the shader completes, before allocating buffers for the next shader stage. My question is how to do this safely.

删掉就好了。在第一阶段删除缓冲区只会删除 id。 id 只是对实际缓冲区对象的另一个引用。当调整缓冲区大小或删除缓冲区时,只会切断 id 和实际缓冲区之间的关联。调整大小实际上会创建一个新缓冲区并将 id 与其重新关联。实际上调用 glBufferData 会做同样的事情(与 glBufferSubData 相反)。这叫做"orphaning".

一旦通过使用或来自 id 的最后一次引用失效,就会释放实际缓冲区。