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