2014-02-08 88 views
0

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

回答

1

我的问题是,有没有什么办法让渲染上下文得出一些分配的内存,而不在一个窗口中绘制了吗?

是的。那些离屏区域被称为帧缓冲区对象(FBO)。

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

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

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

多个OpenGL的上下文可以共享他们的数据对象(纹理,顶点缓冲对象,像素缓冲器的对象);用于此的确切API取决于操作系统。在Windows上,您使用wglShareLists进行连接。抽象状态载体对象(FBO,VAO)不能被共享;作为一个经验法则,您可以上传大容量数据,并在上下文之间共享。

+0

好的,我明白gpu是一个共享资源,但我更喜欢这样做。因为所有的绘图都是二维的(该项目是一个GUI),我最先做的是有一个指向32位整数数组的指针,并从子线程直接绘制到该“缓冲区”,然后将其转换为纹理需要刷新屏幕的时间。即使使用50个200x200,帧率仍然超过750 fps。我只想要一个更简单的方法来在这些线程中执行高级图形。我不想分享上下文。非常感谢您的帮助! – user1433205

0

在大多数platform一个OGL上下文绑定到窗口或视图。你可能做的下一个最好的做法是使这种窗口/视图不可见。

但是,为什么你需要多个上下文呢?尽管只有一个线程可能同时处于活动状态,但OpenGL(在现代卡片上)确实支持渲染离屏纹理,但如果您正在使用传输吞吐量的正确方法,则您并不需要在上下文中使用多个线程。

+1

OpenGL上下文没有以任何方式绑定到特定的窗口。在任何时候都可以将上下文重新绑定到另一个窗口。 – datenwolf

+0

这应该是显而易见的,我的意思是你不能同时绑定两个上下文到同一个窗口。 –

+3

其实你可以,如果每个上下文绑定从一个不同的线程。 – datenwolf