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

时间:2019-04-27 21:47:52

标签: opengl

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

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

我想知道什么,我可以通过跨平台以及可能与普通OpenGL 3.2共享和如何共享它们。 (没有引擎)。

2 个答案:

答案 0 :(得分:3)

OpenGL上下文只能共享对象。即使如此,"container" objects也无法共享。容器对象是其主要目的是将其他对象附加到其上的对象。具体来说,以下是容器对象:

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

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

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

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

其他方法是在创建上下文后立即使用函数。此函数采用两个上下文并在它们之间共享对象。但是,您应该在创建上下文后立即使用此类功能;您不想在目标上下文中创建可能与源中已有对象冲突的对象。 WGL具有an older function, wglShareLists,可在上下文之间共享对象。我知道它只谈论显示列表,但它共享所有可共享对象。

答案 1 :(得分:1)

  

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

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

  

我想知道我可以跨平台共享什么以及如何共享它们

通常,所有保存数据的对象(纹理,顶点/像素/元素对象,renderbuffer对象)是共享的,而持有状态的对象(顶点数组对象,framebuffer对象)则不共享。 >

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

在X11 / GLX环境中,上下文共享总是在上下文创建时设置的,实际上与使用wglCreateContextAttribsARB的{​​{1}}方式相同