循环运行glDispatchCompute

时间:2018-09-20 20:20:21

标签: 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 code in GPU from previous iteration
}

还会执行glsl代码,例如第二次在循环中(i == 1)看到SSBO中第一次执行glsl的结果(i == 0)?

最后我真的需要在循环中调用glMemoryBarrier还是可以在循环之外进行调用?我担心第二次执行GPU代码不会看到SSBO的第一次迭代所做的更改。

1 个答案:

答案 0 :(得分:1)

1)是的,您可以多次运行着色器,而无需读取要写入的缓冲区的内容并在末尾读取它们(这是迭代GPU排序算法的非常普遍的做法)

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

3)是,您需要一个屏障,否则将启动计算着色器dipatch,而无需等待前一个着色器完成,这将导致错误的结果(就您而言),如果不崩溃的话。但是,障碍类型将取决于您在着色器中正在执行的操作。这是障碍的完整列表

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMemoryBarrier.xhtml

最有可能的是,如果您专注于对SSBO进行读/写,则应该使用障碍GL_SHADER_STORAGE_BARRIER_BIT,但是如果不确定,可以仅使用GL_ALL_BARRIER_BITS