Ich habe ein paar Compute-Shader, die in einer bestimmten Reihenfolge ausgeführt werden müssen und deren Ausgabe von vorherigen Eingaben abhängt. Im Idealfall muss ich niemals einen Pufferspeicher clientseitig kopieren und die gesamte Arbeit an der GPU ausführen.
Angenommen, ich habe zwei Compute-Shader kompiliert und als program_one
und verknüpft program_two
. Angenommen, ich habe auch eine GL_SHADER_STORAGE_BUFFER
, die die Daten enthält, in die geschrieben und von denen program_one
gelesen wird program_two
. Kann ich einfach folgendes machen:
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);
Ist sichergestellt, dass alle Aufrufe des ersten Compute-Shaders vor den Aufrufen des zweiten beendet werden (um Datenrennen zwischen Lesen und Schreiben zu vermeiden buffer
)? Wenn nicht, wie synchronisiere ich sie?
quelle