好的,我有一个带有多个线程的程序(在运行时从DLL加载).每个线程都有一个单独的OpenGL渲染上下文.我要从主线程执行的操作是,能够绘制每个opengl上下文的帧缓冲区,并将它们绘制到我在主窗口中选择的位置(如果有任何意义).我将其设置为多线程的原因是,当单线程运行时进程(只是赞美的函数)时,在加载资源时挂起了孔程序(运行时进程可以随时创建和终止).基本上,我希望能够“诱骗” opengl将其绘制到随机缓冲区中,然后将该缓冲区放入主线程,然后将其转换为opengl纹理,然后将其绘制到需要的位置(位置也在运行时确定,可调整的).我的问题是,是否有任何方法可以将渲染上下文绘制到某些已分配的内存中而不在窗口中绘制呢?也有任何方法可以从该上下文中获取帧缓冲区.如果是这样,我只是调用“ glTexImage2D”,并在“字节”参数中有指向内存的指针.不用担心线程同步,我已经很擅长了…
最佳答案
My question is this, is there any way to get a rendering context to draw to some allocated memory without drawing it in a window?
是.这些屏幕外区域称为帧缓冲对象(FBO).
Also is there any way to get the frame buffer from that context. If so i would just call “glTexImage2D” and in the “bytes” argument have the pointer to the memory.
实际上,使用FBO可以直接渲染到纹理.然后,您可以使用纹理绘制到常规窗口.
我建议您不要使用多个OpenGL渲染线程.主要原因是,GPU是共享资源,并且有多个OpenGL上下文/线程同时访问它会影响性能.按顺序执行渲染.您可以为此使用单个共享上下文.
多个OpenGL上下文可以共享它们的数据对象(纹理,顶点缓冲区对象,像素缓冲区对象);用于此目的的确切API取决于操作系统.在Windows上,您使用wglShareLists建立连接.但是,不能共享抽象状态载体对象(FBO,VAO).根据经验,可以在上下文之间共享所有可以上传批量数据的东西.