Що саме робить «makeContextCurrent»?


12

Я дуже розгублений щодо цієї функції. Посилання GLFW контексту говорить наступним чином:

Ця функція робить контекст OpenGL або OpenGL ES заданим вікном поточним на виклику. Контекст може бути поточним лише для одного потоку за один раз, і кожен потік може мати лише один поточний контекст одночасно.

Але це мені не дуже допомагає.
Чи може це працювати як glBind-методи? (glBindBuffer, glBindVertexArray тощо)

Відповіді:


21

OpenGL - державна машина. Контекст OpenGL містить цей стан. Держава містить таку інформацію, як ті, які текстури прив’язані до яких текстурних одиниць, які вкладення має поточне FBO тощо.

Встановлюючи поточний контекст, ви перемикаєте весь стан зі старого контексту на новий. Ось приклад:

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

glfwMakeContextCurrent(window2);

Що це робить, це робить контекст window1поточним. Потім він дозволяє 2D текстуру блоку і зв'язується texture1з ним.

Далі це робить контекст window2поточного. Якби ви перевіряли включений стан, GL_TEXTURE_2Dце було б помилково (якщо ви раніше не вмикали його в window2контексті). Так само, якщо ви перевірите, яка текстура пов'язана з одиницею текстури 2D, ви, ймовірно, не знайдете жодної текстури або якоїсь іншої текстури, ніж texture1зв'язана.

В основному все малювання відбувається в поточному контексті. Якщо зробити поточний інший контекст, то все малювання тепер відбуватиметься в цьому контексті.

У багатопотоковому додатку OpenGL зазвичай є один контекст на потік. Таким чином кожна нитка втягується у власний контекст і не псує стан контекстів на інших потоках.


1
У мене не більше 15 балів, тому я не можу проголосувати вашу чудову відповідь. Дякую!!!
Адріан

1
Не хвилюйтесь. Радий, що можу допомогти.
користувач1118321

Я прочитав цей коментар, тому приєднався до комп'ютерної графіки і підтримав цю відповідь.
J MADISON
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.