Wie kann man eine OpenGL-Multithread-Anwendung verwenden, um VBOs zu aktualisieren und gleichzeitig zu verwenden?

11

Ich habe eine einfache Anwendung. Es hat zwei Threads, jeder mit einem eigenen Rendering-Kontext, aber sie teilen sich einen VBO (dies funktioniert, ich habe es getestet).

Was ich jetzt möchte: Ein Thread rendert einige Daten aus der ersten Hälfte des VBO und der zweite Thread aktualisiert den zweiten Teil des VBO.

Wenn ich das VBO nicht aktualisiere, funktioniert es einwandfrei.

Aber ich habe einige seltsame Probleme beim Aktualisieren. Wenn ich glMapBufferdas VBO (im zweiten Thread) aktualisiere, wird im ersten Thread meistens nichts gerendert - der gesamte Bildschirm ist klar (nach einem glClearAufruf). Es sieht so aus, als ob es keine Daten vom VBO berühren kann (dies ist verständlich, da der gesamte Puffer zugeordnet ist und daher irgendwie gesperrt werden kann).

Ich habe versucht zu verwenden glMapBufferRange, was verwendet GL_MAP_UNSYNCHRONIZED_BIT. Dies sollte bedeuten: "Warten Sie nicht und verwenden Sie das VBO, wie Sie möchten. Ich (das Programm) synchronisiere es selbst." Wenn ich eine Reihe von VBOs zuordne und Daten von einem anderen Teil rendere, sollte es nicht warten, aber ich habe die gleichen Probleme wie bei mir glMapBuffer.

Kann mir jemand helfen, das zu beheben oder zu erklären, warum es passiert?

zacharmarz
quelle

Antworten:

6

Wenn jemand an diesem Problem interessiert ist, finden Sie eine Lösung im OpenGL-Forum . Grundsätzlich können zwei Threads oder Kontexte nicht gleichzeitig auf Puffer zugreifen, weder zum Lesen noch zum Schreiben. Daher wird ein Verriegelungsmechanismus wie std::mutexbenötigt.

zacharmarz
quelle
Vielen Dank für den Hinweis auf die Lösung. Ich habe Ihre Antwort bearbeitet, um sie zusammenzufassen.
Danijar