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

Opengl 从GL计算着色器读取后释放缓冲区,opengl,memory-barriers,compute-shader,Opengl,Memory Barriers,Compute Shader,我有一个Marching Cubes的GPU实现,它使用6个GL计算着色器的序列,在适当的内存屏障之后,每次读取之前着色器写入的缓冲区。早期阶段中使用的缓冲区包含临时标记变量,当不再需要时,应将其大小调整为0,但不能删除,因为我希望在以后的运行中再次使用它们 在某些阶段,我需要从着色器中的缓冲区读取数据,然后在着色器完成后立即取消分配,然后再为下一个着色器阶段分配缓冲区。我的问题是如何安全地这样做。内存障碍文档讨论了在允许另一个着色器读取之前确保完成所有写入,但没有提到第一个着色器中的读取 如果

我有一个Marching Cubes的GPU实现,它使用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);
firstBuffer
是否保证在
firstShader
完成读取之前不会调整大小?如果没有,我如何做到这一点

当不再需要时,应将其大小调整为0,但不要删除,因为我希望在以后的运行中再次使用它们

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

在某些阶段,我需要从着色器中的缓冲区读取数据,然后在着色器完成后立即取消分配,然后再为下一个着色器阶段分配缓冲区。我的问题是如何安全地这样做

删除它就行了。在第一阶段删除缓冲区只会删除id。id只是对实际缓冲区对象的另一个引用。调整或删除缓冲区时,仅切断id和实际缓冲区之间的关联。调整大小实际上会创建一个新的缓冲区,并将id与其重新关联。事实上,调用
glBufferData
会做同样的事情(与
glBufferSubData
相反)。这被称为“孤儿”


实际的缓冲区在最后一次引用(通过使用或从id)下降时被释放。

谢谢,这就是我所需要知道的:)请注意,在主性能循环中分配/释放内存并不会为性能带来任何好处。事实上,如果您将计算着色器重新构造为使用共享变量,而不是多次传递和对GPU内存的读/写,那么您可能会从算法中获得更多。我正在为相当大的网格建模,所以问题是内存使用,而不是性能。我使用前两个过程来收集样本并找到生成立方体的几何体,这样从那时起我就可以运行少得多的调用。有几点我必须将整个样本空间保存在内存中,这可能需要数百MB,因此我希望在完成后尽快将其删除。不知道如何使用共享变量,因为它们非常小,并且仅限于一个工作组,对吗?