Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL函数实际上是特定于上下文的吗?_C++_Opengl_Glfw_Glad - Fatal编程技术网

C++ OpenGL函数实际上是特定于上下文的吗?

C++ OpenGL函数实际上是特定于上下文的吗?,c++,opengl,glfw,glad,C++,Opengl,Glfw,Glad,我知道,在初始化上下文后,我必须将glfwGetProcAddress函数传递给gladLoadGLLoader函数。GLFW文档说明此函数返回当前上下文中指定函数的地址。根据这些信息,如果我想在另一个上下文中绘制一些东西,我必须键入 glfwMakeContextCurrent(*window*) gladLoadGLLoader((GLADloadproc)glfwGetProcAddress) 每次我要更改绘图上下文时。但是,只需使用glfwMakeContextCurrent函数更改上

我知道,在初始化上下文后,我必须将
glfwGetProcAddress
函数传递给
gladLoadGLLoader
函数。GLFW文档说明此函数返回当前上下文中指定函数的地址。根据这些信息,如果我想在另一个上下文中绘制一些东西,我必须键入

glfwMakeContextCurrent(*window*)
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)
每次我要更改绘图上下文时。但是,只需使用
glfwMakeContextCurrent
函数更改上下文就足够了。文件还包括备注

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


但返回的地址在不同的上下文之间似乎是相同的(至少在windows中是如此)。问题是,为了实现稳定和可移植的行为,真正的方法是什么?

技术上是的:从OpenGL上下文检索的函数指针仅对该特定上下文有效。但是,出于大多数实际目的,您可以忽略这一点。如果两个上下文可以共享对象,那么它们几乎肯定会共享函数指针


如果您想考虑函数指针不能在上下文中共享的情况,最好的选择是编写一个专门用于处理这种情况的加载程序。例如,您可以将OpenGL函数放在一个结构中,然后根据不同的上下文将函数加载到不同的结构中。

尝试一种更奇特的配置,例如来自不同GPU供应商的视频卡驱动不同的显示器:)@genpfault现在就这样做,让每个卡在5x2显示墙上驱动多个监视器,安装人员明智地将5个显示器上下颠倒,并焊接夹具,使顶部的显示器上下颠倒,注意其中一个制造商允许您正确旋转顶部图像,而另一个制造商则不允许,而且保持卡片同步是徒劳的。WindowsAPI保证如果函数指针的像素格式相同,那么它们在两个上下文中是相同的。实际上,你得到的不仅仅是这些:如果它们最终在同一个ICD中,它们通常是相同的。但请注意,在windows上,您可以使用不同的ICD,即Microsoft GDI渲染器、一些专用GPU和集成GPU。如果你真的想,你可以在同一个应用程序中用不可共享的函数指针创建不同的上下文。“把OpenGL函数放在一个结构中,然后根据不同的上下文将函数加载到不同的结构中。”分支已经有了这个FWIW。