我可以在不读取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的第一次迭代所做的更改。
答案 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
。