运行 循环中的 glDispatchCompute
run glDispatchCompute in a loop
我可以在不从 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) 是的,你可以多次 运行 你的着色器而不读取你正在写入的缓冲区的内容并在最后读取它们(这是迭代 GPU 排序算法的一种非常常见的做法)
2) 如果你reading/writting到同一个缓冲区,是的,它们将是可见的
3) 是的,你需要一个障碍,否则计算着色器 dipatch 将在没有等待前一个完成的情况下启动,这将导致错误的结果(如你所担心的),如果不是崩溃的话。但是,屏障类型将取决于您在着色器中所做的事情。这是障碍的完整列表
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMemoryBarrier.xhtml
最有可能的是,如果您专注于 reading/writing 到 SSBO,您应该使用屏障 GL_SHADER_STORAGE_BARRIER_BIT
,但如果您不确定,您可以只使用 GL_ALL_BARRIER_BITS
。
我可以在不从 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) 是的,你可以多次 运行 你的着色器而不读取你正在写入的缓冲区的内容并在最后读取它们(这是迭代 GPU 排序算法的一种非常常见的做法)
2) 如果你reading/writting到同一个缓冲区,是的,它们将是可见的
3) 是的,你需要一个障碍,否则计算着色器 dipatch 将在没有等待前一个完成的情况下启动,这将导致错误的结果(如你所担心的),如果不是崩溃的话。但是,屏障类型将取决于您在着色器中所做的事情。这是障碍的完整列表
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMemoryBarrier.xhtml
最有可能的是,如果您专注于 reading/writing 到 SSBO,您应该使用屏障 GL_SHADER_STORAGE_BARRIER_BIT
,但如果您不确定,您可以只使用 GL_ALL_BARRIER_BITS
。