“ makeContextCurrent”到底能做什么?


12

我对该功能非常困惑。GLFW上下文参考如下:

该函数使指定线程的指定窗口的OpenGL或OpenGL ES上下文在调用线程上为当前。每次只能在一个线程上使一个上下文成为当前上下文,而每个线程一次只能具有一个当前上下文。

但这对我没有太大帮助。
可以像glBind-方法一样工作吗?(glBindBuffer,glBindVertexArray等)

Answers:


21

OpenGL是一种状态机。OpenGL上下文保持该状态。状态包含诸如哪些纹理绑定到哪些纹理单元,当前FBO具有的附件以及类似信息之类的信息。

设置当前上下文时,您会将所有状态从旧上下文切换到新上下文。这是一个例子:

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

glfwMakeContextCurrent(window2);

这是在window1当前环境下进行的。然后,它启用2D纹理单元并与其绑定texture1

接下来,它成为window2当前的上下文。如果要检查其启用状态,GL_TEXTURE_2D则将为false(除非您之前已在window2上下文中启用它)。同样,如果检查将哪个纹理绑定到2D纹理单元,则可能会发现没有纹理绑定,或者绑定了其他纹理texture1

基本上所有绘制都发生在当前上下文中。如果当前使用其他上下文,则所有绘制现在都将在该上下文中进行。

在多线程OpenGL应用程序中,每个线程通常只有一个上下文。这样,每个线程都将吸引到自己的上下文中,并且不会弄乱其他线程上的上下文状态。


1
我的得分不超过15分,因此我无法投票赞成您的出色回答。谢谢!!!
阿德里安

1
别担心。很高兴我能帮上忙。
user1118321

我读了此评论,所以我加入了计算机图形学,并对此回答进行了投票。
J MADISON
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.