OpenGL 上下文之间可共享的内容以及如何启用共享

Dev*_*its 5 opengl

我正在制作一个 CAD 软件,它将为类似的视图创建不同的 OpenGL 上下文(如果它们没有显示相同的东西)。

我想在它们之间共享尽可能多的 OpenGL 上下文数据,尤其是 VBO 和着色器。

我想知道我可以分享什么以及如何分享它们,以跨平台的方式并且可能使用普通的 OpenGL 3.2(无引擎)。

dat*_*olf 6

我正在制作一个 CAD 软件,它将为相似的视图创建不同的 OpenGL 上下文(如果它们没有显示相同的内容)。

为此,您不需要不同的上下文。OpenGL 上下文不绑定到特定窗口或可绘制对象。您可以将 OpenGL 上下文绑定到任何与像素格式兼容的窗口/可绘制对象。

我想知道我可以分享什么以及如何以跨平台的方式分享它们

一般来说,保存数据的所有对象(纹理、顶点/像素/元素对象、渲染缓冲区对象)都是共享的,保存状态的对象(顶点数组对象、帧缓冲区对象)则不是共享的。

在 Windows 中,共享是通过调用wglShareLists将新创建的上下文连接到以前存在的上下文来设置的。或者通过传递上下文句柄来与 to 共享wglCreateContextAttribsARB;然而,要获得指向该函数的函数指针,您首先必须创建一个代理上下文(这需要跳过一些步骤,我已在https://git.datenwolf.net/wglarb/中实现了这一点,因此您可以简单地调用wglarb_CreateContextAttribsARB而无需关心其余的)。

在 X11/GLX 环境中,上下文共享始终在上下文创建时设置,实际上与wglCreateContextAttribsARB使用glXCreateContext


Nic*_*las 5

OpenGL 上下文唯一可以共享的东西是对象。即便如此,“容器”对象也无法共享。容器对象是主要目的是让其他对象附加到它们的对象。具体来说,以下是容器对象:

  • 帧缓冲对象
  • 顶点数组对象
  • 变换反馈对象
  • 程序管道对象

所有其他对象都可以共享。

共享对象是一项基于上下文的任务,通常作为上下文创建的一部分或之后立即完成。但是,由于这是在上下文本身上完成的,因此不能跨平台操作。OpenGL 只定义上下文的行为,而不定义如何操作上下文对象。负责创建和管理上下文的特定于平台的 API 处理:GLX、WGL、EGL 等。

通常有两种处理方式。一种方法是上下文创建函数将另一个上下文作为参数;新创建的上下文将与给定的上下文共享所有可共享的对象。wglCreateContextAttribsARB是 WGL 上下文创建函数,它接受一个上下文与新的共享。

另一种方法是在创建上下文后立即使用函数。这个函数需要两个上下文并在它们之间共享对象。但是,您应该在创建上下文后立即使用这样的函数;您不想在目标上下文中创建可能与源中已有的对象冲突的对象。WGL 有一个较旧的函数 ,wglShareLists它在上下文之间共享对象。我知道它只讨论显示列表,但它共享所有可共享的对象。