OpenGL函数是否真的与上下文有关?

4

我知道在上下文被初始化后,必须将 glfwGetProcAddress 函数传递给 gladLoadGLLoader 函数。GLFW文档显示,该函数返回当前上下文指定函数的地址。基于这个信息,如果我想在另一个上下文中绘制图形,我必须输入

glfwMakeContextCurrent(*window*)
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)

每次我想要改变绘图上下文时,都需要使用 glfwMakeContextCurrent 函数来简单地更改上下文。文档还指出:

给定函数的地址不能保证在上下文之间相同。

但是在不同上下文中返回的地址似乎实际上是相同的(至少在Windows中)。问题是,为了实现稳定和便携行为,真正的方法是什么?

2
尝试更奇特的配置,比如来自不同GPU供应商的视频卡驱动独立的显示器 :) - genpfault
@genpfault,现在考虑一下,让每张卡片在一个5x2的显示墙上驱动多个监视器,安装者明智地将5个倒置并焊接夹具,使得顶部的卡片必须倒置,注意到其中一个制造商可以正确旋转顶部图像,而另一个则不行,并且保持卡片同步是徒劳的。 - 3Dave
Windows API保证如果两个上下文为相同的像素格式创建了相同的函数指针,则它们是相同的。实际上,您可以获得更多:如果它们最终在同一个ICD中,它们通常是相同的。但请注意,在Windows上,您可以拥有不同的ICD,即Microsoft GDI渲染器、一些专用GPU和集成GPU。如果您真的想要,您可以在同一个应用程序中创建具有不可共享函数指针的不同上下文。 - derhass
1个回答

4

从技术上讲,是的:从OpenGL上下文中检索到的函数指针仅对该特定上下文有效。然而,在大多数实际情况下,您可以忽略此问题。如果两个上下文可以共享对象,则它们几乎肯定共享函数指针。

如果您想考虑那些不能在上下文间共享函数指针的情况,最好的选择是编写一个专门处理这种情况的加载器。例如,您可以修改GLAD将OpenGL函数放在一个结构体中,并将函数加载到不同的结构体中以用于不同的上下文。


2
将GLAD修改为将OpenGL函数放入结构体中,然后将这些函数加载到不同的结构体中以供不同的上下文使用。顺便说一句,GLAD2分支已经实现了这个功能。 - genpfault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接