我正在制作一个 CAD 软件,它将为类似的视图创建不同的 OpenGL 上下文(如果它们没有显示相同的东西)。
我想在它们之间共享尽可能多的 OpenGL 上下文数据,尤其是 VBO 和着色器。
我想知道我可以分享什么以及我如何分享它们,以跨平台的方式并且可能使用普通的 OpenGL 3.2(无引擎)。
我正在制作一个 CAD 软件,它将为相似的视图创建不同的 OpenGL 上下文(如果它们没有显示相同的内容)。
为此,您不需要不同的上下文。OpenGL 上下文不绑定到特定窗口或可绘制对象。您可以将 OpenGL 上下文绑定到任何与像素格式兼容的窗口/可绘制对象。
我想知道我可以分享什么以及如何以跨平台的方式分享它们
一般来说,保存数据的所有对象(纹理、顶点/像素/元素对象、渲染缓冲区对象)都是共享的,保存状态的对象(顶点数组对象、帧缓冲区对象)则不是共享的。
在 Windows 中,共享是通过调用wglShareLists将新创建的上下文连接到以前存在的上下文来设置的。或者通过传递上下文句柄来与 to 共享wglCreateContextAttribsARB;然而,要获得指向该函数的函数指针,您首先必须创建一个代理上下文(这需要跳过一些步骤,我已在https://git.datenwolf.net/wglarb/中实现了这一点,因此您可以简单地调用wglarb_CreateContextAttribsARB而无需关心其余的)。
在 X11/GLX 环境中,上下文共享始终在上下文创建时设置,实际上与wglCreateContextAttribsARB使用glXCreateContext
OpenGL 上下文唯一可以共享的东西是对象。即便如此,“容器”对象也无法共享。容器对象是主要目的是让其他对象附加到它们的对象。具体来说,以下是容器对象:
所有其他对象都可以共享。
共享对象是一项基于上下文的任务,通常作为上下文创建的一部分或之后立即完成。但是,由于这是在上下文本身上完成的,因此不能跨平台操作。OpenGL 只定义上下文的行为,而不定义如何操作上下文对象。负责创建和管理上下文的特定于平台的 API 处理:GLX、WGL、EGL 等。
通常有两种处理方式。一种方法是上下文创建函数将另一个上下文作为参数;新创建的上下文将与给定的上下文共享所有可共享的对象。wglCreateContextAttribsARB是 WGL 上下文创建函数,它接受一个上下文与新的共享。
另一种方法是在创建上下文后立即使用函数。这个函数需要两个上下文并在它们之间共享对象。但是,您应该在创建上下文后立即使用这样的函数;您不想在目标上下文中创建可能与源中已有的对象冲突的对象。WGL 有一个较旧的函数 ,wglShareLists它在上下文之间共享对象。我知道它只讨论显示列表,但它共享所有可共享的对象。
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |