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