Glsl 在循环中运行glDispatchCompute

Glsl 在循环中运行glDispatchCompute,glsl,compute-shader,Glsl,Compute Shader,我可以在循环中运行此代码而不从SSBO读取结果吗?并且仅在100次迭代后读取SSBO结果 for (int i=0; i <100; i++){ glDispatchCompute(1, 200, 1); glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);//i understand this needed to ensure //it is done running the glsl c

我可以在循环中运行此代码而不从SSBO读取结果吗?并且仅在100次迭代后读取SSBO结果

for (int i=0; i <100; i++){
 glDispatchCompute(1, 200, 1);    
 glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);//i understand this needed to ensure 
                 //it is done running the glsl code in GPU from previous iteration
}
对于(int i=0;i1)是的,您可以多次运行着色器,而无需读取正在写入的缓冲区的内容,并在最后读取它们(这是迭代GPU排序算法的常见做法)

2) 如果您正在读/写同一个缓冲区,是的,它们将可见

3) 是的,您需要一个屏障,否则将在不等待上一个完成的情况下启动计算着色器dipatch,如果不崩溃,将导致错误的结果(如您所关心的)。但是,屏障类型将取决于您在着色器中执行的操作。下面是一个完整的障碍列表

最可能的情况是,如果您专注于读取/写入SSBO,您应该使用barrier
GL\u SHADER\u STORAGE\u barrier\u BIT
,但如果您不确定,您可以只使用
GL\u ALL\u barrier\u BIT