我有几个需要按一定顺序执行的计算着色器,它们的输出取决于以前的输入。理想情况下,我永远不需要在客户端复制缓冲区并在GPU上完成所有工作。
考虑一下,我有两个计算着色器已编译并链接为program_one
和program_two
。假设我还有一个GL_SHADER_STORAGE_BUFFER
包含由写入program_one
和读取的数据的program_two
。我可以简单地执行以下操作:
glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);
glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);
是否可以保证第一个计算着色器的所有调用将在第二个计算着色器的任何调用之前完成(以避免读写之间的数据争用buffer
)?如果没有,如何同步它们?