У меня есть пара вычислительных шейдеров, которые должны быть выполнены в определенном порядке и чьи выходные данные зависят от предыдущих входных данных. В идеале мне никогда не понадобится копировать буфер на стороне клиента и выполнять всю мою работу на 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)? Если нет, как мне их синхронизировать?