Что именно делает 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
Не беспокойся. Рад, что смог помочь.
user1118321

Я прочитал этот комментарий, поэтому я присоединился к компьютерной графике и проголосовал за этот ответ.
J MADISON
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.