什么可以在OpenGL上下文之间共享,如何启用共享?

12

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

我想在这些OpenGL上下文之间尽可能分享数据,特别是VBO和着色器。

我想知道可以分享哪些内容以及如何以跨平台的方式分享它们,并且最好使用纯OpenGL 3.2(无引擎)。


1
除非您使用某些库(如glfw等),否则无法以平台无关的方式创建共享上下文,因为上下文创建本身是特定于平台的。 - BDL
2个回答

15
OpenGL上下文唯一能够共享的是对象,即使是“容器”对象也不能共享。容器对象是指主要用于附加其他对象的对象。具体而言,以下是容器对象:
- 帧缓冲对象 - 顶点数组对象 - 变换反馈对象 - 程序管线对象
所有其他对象都可以共享。
共享对象是基于上下文的任务,通常作为上下文创建的一部分或紧随其后完成。然而,由于这是在上下文本身上完成的,因此它不可能是跨平台操作。OpenGL仅定义上下文的行为,而不定义如何操作上下文对象。负责创建和管理上下文的特定于平台的API处理这个问题:GLX、WGL、EGL等。
通常有两种处理方式。一种方式是让上下文创建函数以另一个上下文作为参数;新创建的上下文将与给定的上下文共享所有可共享的对象。wglCreateContextAttribsARB是WGL上下文创建函数,它带有一个与新上下文共享的上下文参数。
另一种方法是在创建上下文后立即使用一个函数。该函数接受两个上下文并共享它们之间的对象。但是,您应该在创建上下文后立即使用此函数;您不希望在目标上下文中创建可能与源上下文中已有的对象冲突的对象。WGL有一个较旧的函数wglShareLists,可在多个上下文之间共享对象。虽然它只谈到显示列表,但它可以共享所有可共享对象。

6
我正在制作一款CAD软件,将为类似的视图创建不同的OpenGL上下文(如果它们没有显示相同的内容)。
其实你不需要为此创建不同的上下文。OpenGL上下文并不绑定到特定的窗口或可绘制对象上。你可以将OpenGL上下文绑定到任何具有兼容像素格式的窗口/可绘制对象上。
我想知道我可以分享什么以及如何在跨平台的方式下进行分享。
通常,保存数据的所有对象(纹理、顶点/像素/元素对象、渲染缓冲区对象等)都是可共享的,保存状态的对象(顶点数组对象、帧缓冲区对象)则不能共享。
在Windows中,通过调用 wglShareLists 来连接新创建的上下文与先前存在的上下文。或者通过将要与之共享的上下文句柄传递给 wglCreateContextAttribsARB 来分享。但是,要获得该函数的函数指针,您必须首先创建一个代理上下文(这需要跳过几个步骤,我已经在 https://git.datenwolf.net/wglarb/ 中实现了这些步骤,所以您只需调用 wglarb_CreateContextAttribsARB 即可,无需关心其余部分)。
在X11/GLX环境中,上下文共享始终是在创建上下文时设置的,与使用 wglCreateContextAttribsARB 的方式基本相同,使用 glXCreateContext

“通常,保存数据的所有对象(纹理、顶点/像素/元素/渲染缓冲区对象)都是共享的”...这不是它的工作方式。有许多仅限于状态的对象会被共享:采样器对象、查询对象、同步对象等。不能共享容器对象(附加其他对象的对象)。此外,“渲染缓冲区对象”并不存在;存在“渲染缓冲区对象”,其与“顶点/像素/元素”缓冲区对象根本不同。 - Nicol Bolas
@NicolBolas:我认为OP是OpenGL的新手,所以我认为最好将更精细的语义留到以后。在我看来,这已经足够粗略、笼统地描绘出了整体情况,以便让人们理解。对于其他任何事情,你唯一明智的做法就是参考规范(或者在这里复制规范)。 - datenwolf

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