Mam kilka shaderów obliczeniowych, które należy wykonać w określonej kolejności i których wyniki zależą od poprzednich danych wejściowych. Idealnie, nigdy nie będę musiał kopiować bufora po stronie klienta i wykonywać całej mojej pracy na GPU.
Rozważ, że mam dwa shadery obliczeniowe skompilowane i połączone jako program_one
i program_two
. Załóżmy, że mam również plik, GL_SHADER_STORAGE_BUFFER
który zawiera dane, które są zapisywane program_one
i czytane przez program_two
. Czy mogę po prostu wykonać następujące czynności:
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);
Czy jest zagwarantowane, że wszystkie wywołania pierwszego modułu obliczeniowego zakończą się przed wywołaniem drugiego (aby uniknąć wyścigów danych między odczytem a zapisem buffer
)? Jeśli nie, jak je zsynchronizować?
źródło