OpenGL 函数实际上是特定于上下文的吗?
Are OpenGL functions actually context-specific?
我知道我必须在初始化上下文后将 glfwGetProcAddress
函数传递给 gladLoadGLLoader
函数。 GLFW 文档说这个函数 returns 为 CURRENT 上下文指定函数的地址。根据这些信息,如果我想在另一个上下文中绘制一些东西,我必须键入
glfwMakeContextCurrent(*window*)
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)
每次我想更改绘图上下文。但是,只需使用 glfwMakeContextCurrent
函数更改上下文就足够了。文档也有备注
The address of a given function is not guaranteed to be the same
between contexts.
但似乎返回的地址在上下文之间实际上是相同的(至少在 windows 中)。问题是,为了实现稳定和便携的行为,真正的方法是什么?
技术上是:从 OpenGL 上下文检索的函数指针仅对该特定上下文有效。但是,出于大多数实际目的,您可以忽略它。如果两个上下文可以共享对象,那么它们几乎肯定会共享函数指针。
如果您想解决无法跨上下文共享函数指针的情况,最好的选择是编写专门用于处理这种可能性的加载程序。例如,您可以修改 GLAD 以将 OpenGL 函数放入一个结构中,然后将这些函数加载到不同上下文的不同结构中。
我知道我必须在初始化上下文后将 glfwGetProcAddress
函数传递给 gladLoadGLLoader
函数。 GLFW 文档说这个函数 returns 为 CURRENT 上下文指定函数的地址。根据这些信息,如果我想在另一个上下文中绘制一些东西,我必须键入
glfwMakeContextCurrent(*window*)
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)
每次我想更改绘图上下文。但是,只需使用 glfwMakeContextCurrent
函数更改上下文就足够了。文档也有备注
The address of a given function is not guaranteed to be the same between contexts.
但似乎返回的地址在上下文之间实际上是相同的(至少在 windows 中)。问题是,为了实现稳定和便携的行为,真正的方法是什么?
技术上是:从 OpenGL 上下文检索的函数指针仅对该特定上下文有效。但是,出于大多数实际目的,您可以忽略它。如果两个上下文可以共享对象,那么它们几乎肯定会共享函数指针。
如果您想解决无法跨上下文共享函数指针的情况,最好的选择是编写专门用于处理这种可能性的加载程序。例如,您可以修改 GLAD 以将 OpenGL 函数放入一个结构中,然后将这些函数加载到不同上下文的不同结构中。