OpenGL在一个窗口中有多个渲染上下文

OpenGL multiple rendering contexts in one window

本文关键字:上下文 一个 OpenGL 窗口      更新时间:2023-10-16

好的,我有一个带有多个线程的程序(在运行时从DLL加载)。每个线程都有一个单独的OpenGL渲染上下文。我想做的是,从主线程中,能够绘制每个opengl上下文的帧缓冲区,并将它们绘制在我在主窗口中选择的位置(如果这有意义的话)。我将其设置为多线程,因为当单线程时,"运行时进程"(只是美化的函数)会使孔程序在加载资源时挂起(运行时进程,可以随时创建和终止)。基本上,我希望能够"欺骗"opengl将其绘制到一个随机缓冲区中,取该缓冲区,在主线程中将其转换为opengl纹理,并将其绘制在需要的位置(位置也在运行时确定,可能会发生变化)。我的问题是,有没有任何方法可以在不在窗口中绘制的情况下,将渲染上下文绘制到分配的内存中?还有没有任何方法可以从该上下文中获取帧缓冲区。如果是这样的话,我只需要调用"glTexImage2D",在"字节"参数中有指向内存的指针。别担心线程同步,我已经很擅长了…

我的问题是,有没有办法在不在窗口中绘制的情况下,让渲染上下文绘制到分配的内存中?

是。这些屏幕外区域称为帧缓冲区对象(FBO)。

还有没有任何方法可以从该上下文中获取帧缓冲区。如果是这样的话,我只需要调用"glTexImage2D",在"字节"参数中有指向内存的指针。

事实上,使用FBO可以直接渲染到纹理。然后可以使用纹理绘制到常规窗口。

我建议您不要使用多个OpenGL渲染线程。主要原因是,GPU是一个共享资源,让多个OpenGL上下文/线程同时访问它会降低性能。按顺序进行渲染。您可以使用一个单独的共享上下文。

多个OpenGL上下文可以共享它们的数据对象(纹理、顶点缓冲区对象、像素缓冲区对象);用于此目的的确切API取决于通过的操作系统。在Windows上,您可以使用wglShareLists进行连接。抽象状态载体对象(FBO、VAO)不能共享;根据经验,任何可以上传批量数据的东西都可以在上下文之间共享。

在大多数平台上,OGL上下文绑定到窗口或视图。你可以做的下一个最好的办法是使这样的窗口/视图不可见。

但为什么你需要多个上下文呢?OpenGL(在现代卡上)确实支持对屏幕外纹理的渲染,尽管一次可能只有一个线程处于活动状态,但如果你做得正确以利用传输吞吐量,你就不需要有多个线程来处理上下文。