Co dokładnie robi „makeContextCurrent”?

12

Jestem dość zdezorientowany tą funkcją. Odwołanie do kontekstu GLFW brzmi następująco:

Ta funkcja sprawia, że ​​kontekst OpenGL lub OpenGL ES określonego okna jest aktualny w wątku wywołującym. Kontekst może być aktualny tylko w jednym wątku naraz, a każdy wątek może mieć jednocześnie tylko jeden bieżący kontekst.

Ale niewiele mi to pomaga.
Czy może działać jak glBind-metody? (glBindBuffer, glBindVertexArray i tak dalej)

Adrian
źródło

Odpowiedzi:

21

OpenGL jest maszyną stanową. Kontekst OpenGL utrzymuje ten stan. Stan zawiera informacje, takie jak jakie tekstury są powiązane z którymi jednostkami tekstur, jakie załączniki ma bieżące FBO i tym podobne.

Po ustawieniu bieżącego kontekstu przełączasz cały stan ze starego kontekstu na nowy. Oto przykład:

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

glfwMakeContextCurrent(window2);

To sprawia, że ​​kontekst jest window1aktualny. Następnie włącza jednostkę tekstury 2D i wiąże się texture1z nią.

Następnie tworzy kontekst window2bieżący. Jeśli miałbyś sprawdzić, włączony stan GL_TEXTURE_2Dbyłby fałszywy (chyba że wcześniej włączyłeś to w window2kontekście). Podobnie, jeśli sprawdzisz, która tekstura jest powiązana z jednostką tekstury 2D, prawdopodobnie nie zobaczysz żadnej tekstury, ani żadnej innej tekstury niż texture1związana.

Zasadniczo cały rysunek odbywa się w bieżącym kontekście. Jeśli zmienisz bieżący kontekst na inny, wówczas wszystkie rysunki będą się teraz odbywać w tym kontekście.

Często stosuje się jeden kontekst na wątek w wielowątkowej aplikacji OpenGL. W ten sposób każdy wątek rysuje się we własnym kontekście i nie psuje stanu kontekstów w innych wątkach.

użytkownik1118321
źródło
1
Nie mam więcej niż 15 punktów, więc nie mogę zagłosować na twoją niesamowitą odpowiedź. Dzięki!!!
Adrian
1
Bez obaw. Cieszę się, że mogłem pomóc.
user1118321
Przeczytałem ten komentarz, więc dołączyłem do informatyki i głosowałem za odpowiedzią.
J MADISON