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

时间:2014-02-08 18:05:36

标签: c++ multithreading opengl rendering

好的我有一个包含多个线程的程序(在运行时从DLL加载)。每个线程都有一个单独的OpenGL渲染上下文。我想要做的是,从主线程,能够绘制每个opengl上下文的帧缓冲区,并在主窗口中选择我所选择的位置(如果这有意义)。我有它设置多线程,因为,当单线程“运行时进程”(只是美化功能)时,使孔程序在加载资源时挂起(运行时进程,可以随时创建和终止)。基本上我希望能够“欺骗”opengl绘制到随机缓冲区中,取出缓冲区并在主线程中将其转换为opengl纹理并将其绘制到需要的位置(位置也在运行时确定)可调整的)。我的问题是,有没有办法让渲染上下文绘制到一些分配的内存而不在窗口中绘制它?还有什么方法可以从该上下文中获取帧缓冲区。如果是这样,我只会调用“glTexImage2D”并在“bytes”参数中有指向内存的指针。不要担心线程同步,我已经相当擅长...

2 个答案:

答案 0 :(得分:1)

  

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

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

  

还有什么方法可以从该上下文中获取帧缓冲区。如果是这样,我只会调用“glTexImage2D”并在“bytes”参数中指向内存。

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

我建议您不要使用多个OpenGL渲染线程。主要原因是GPU是一个共享资源,并且有多个OpenGL上下文/线程同时访问它会损害性能。按顺序进行渲染。您可以为此使用单个共享上下文。

多个OpenGL上下文可以共享其数据对象(纹理,顶点缓冲对象,像素缓冲对象);用于此的确切API取决于操作系统。在Windows上,您使用wglShareLists建立连接。但是,不能共享抽象的状态载体对象(FBO,VAO);根据经验,您可以上传批量数据,可以在上下文之间共享。

答案 1 :(得分:0)

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

但为什么你还需要多个背景? OpenGL(在现代卡片上)确实支持渲染到屏幕外纹理,尽管一次只能激活一个线程,但如果你正确地利用传输吞吐量,你实际上并不需要在上下文中有多个线程。