好吧,我有一个带有多个线程的程序(在运行时从DLL加载)。每个线程都有一个单独的OpenGL渲染上下文。我要从主线程执行的操作是,能够绘制每个opengl上下文的帧缓冲区,并将它们绘制到我在主窗口中选择的位置(如果有任何意义)。我将它设置为多线程,因为当单线程运行时进程(只是赞美的函数)时,在加载资源时使Hole程序挂起(运行时进程可以随时创建和终止)。基本上,我希望能够“诱骗” opengl将其绘制到随机缓冲区中,并在主线程中将其转换为opengl纹理并将其绘制到需要的位置(位置也由运行时确定,并且可调整的)。我的问题是,是否有任何方法可以将渲染上下文绘制到某些已分配的内存中而不在窗口中绘制它?也有任何方法可以从该上下文中获取帧缓冲区。如果是这样,我只是调用“ glTexImage2D”,并在“字节”参数中有指向内存的指针。不用担心线程同步,我已经很擅长了...
我的问题是,有没有办法在不将其绘制在窗口中的情况下将绘制上下文绘制到分配的内存中?
是。这些屏幕外区域称为帧缓冲对象(FBO)。
还有任何方法都可以从该上下文中获取帧缓冲区。如果是这样的话,我只是调用“ glTexImage2D”,并在“字节”参数中有指向内存的指针。
实际上,使用FBO可以直接渲染到纹理。然后,您可以使用纹理绘制到常规窗口。
我建议您不要使用多个OpenGL渲染线程。主要原因是,GPU是共享资源,并且有多个OpenGL上下文/线程同时访问它会影响性能。按顺序执行渲染。您可以为此使用一个共享的上下文。
多个OpenGL上下文可以共享其数据对象(纹理,顶点缓冲区对象,像素缓冲区对象);用于此目的的确切API取决于操作系统。在Windows上,使用wglShareLists
进行连接。但是,不能共享抽象状态载体对象(FBO,VAO)。根据经验,所有可以上传批量数据的内容都可以在上下文之间共享。
[在大多数平台上,OGL上下文绑定到窗口或视图。您可能要做的下一个最佳选择是使这种窗口/视图不可见。
但是为什么仍然需要多个上下文? OpenGL(在现代卡上)确实支持渲染到屏幕外的纹理,尽管一次可能只有一个线程处于活动状态,但是如果您正确地利用了传输吞吐量,则实际上并不需要在上下文中具有多个线程。