Was macht "makeContextCurrent" genau?

12

Ich bin ziemlich verwirrt über diese Funktion. Die GLFW-Kontextreferenz lautet wie folgt:

Diese Funktion macht den OpenGL- oder OpenGL ES-Kontext des angegebenen Fensters im aufrufenden Thread aktuell. Ein Kontext kann jeweils nur für einen einzelnen Thread aktuell gemacht werden, und jeder Thread kann jeweils nur einen aktuellen Kontext haben.

Aber es hilft mir nicht viel.
Kann es wie glBind-Methoden funktionieren ? (glBindBuffer, glBindVertexArray und so weiter)

Adrian
quelle

Antworten:

19

OpenGL ist eine Zustandsmaschine. Ein OpenGL-Kontext enthält diesen Status. Der Status enthält Informationen, z. B. welche Texturen an welche Textureinheiten gebunden sind, welche Anhänge der aktuelle FBO hat und ähnliches.

Wenn Sie den aktuellen Kontext festlegen, wechseln Sie den gesamten Status vom alten in den neuen Kontext. Hier ist ein Beispiel:

glfwMakeContextCurrent(window1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture1);

glfwMakeContextCurrent(window2);

Dies macht den Kontext window1aktuell. Anschließend wird die 2D-Textureinheit aktiviert und daran gebunden texture1.

Als nächstes macht es den Kontext der window2aktuellen. Wenn Sie den aktivierten Status überprüfen GL_TEXTURE_2Dwürden, wäre dies falsch (es sei denn, Sie haben ihn zuvor im window2Kontext aktiviert ). Wenn Sie überprüfen, welche Textur an die 2D-Textureinheit gebunden ist, werden Sie wahrscheinlich feststellen, dass keine Textur oder eine andere als texture1die gebundene Textur gebunden wurde.

Grundsätzlich erfolgt das Zeichnen im aktuellen Kontext. Wenn Sie einen anderen Kontext aktuell machen, werden jetzt alle Zeichnungen in diesem Kontext ausgeführt.

In einer OpenGL-Anwendung mit mehreren Threads ist es üblich, einen einzelnen Kontext pro Thread zu haben. Auf diese Weise zeichnet jeder Thread in seinen eigenen Kontext und bringt den Status der Kontexte in anderen Threads nicht durcheinander.

user1118321
quelle
1
Ich habe nicht mehr als 15 Punkte, daher kann ich Ihre großartige Antwort nicht bewerten. Vielen Dank!!!
Adrian
1
Keine Bange. Froh, dass ich helfen konnte.
user1118321
Ich habe diesen Kommentar gelesen, bin also zu Computergraphics gekommen und habe diese Antwort positiv bewertet.
J Madison