OpenGL在一个窗口中有多个渲染上下文
OpenGL multiple rendering contexts in one window
好的,我有一个带有多个线程的程序(在运行时从DLL加载)。每个线程都有一个单独的OpenGL渲染上下文。我想做的是,从主线程中,能够绘制每个opengl上下文的帧缓冲区,并将它们绘制在我在主窗口中选择的位置(如果这有意义的话)。我将其设置为多线程,因为当单线程时,"运行时进程"(只是美化的函数)会使孔程序在加载资源时挂起(运行时进程,可以随时创建和终止)。基本上,我希望能够"欺骗"opengl将其绘制到一个随机缓冲区中,取该缓冲区,在主线程中将其转换为opengl纹理,并将其绘制在需要的位置(位置也在运行时确定,可能会发生变化)。我的问题是,有没有任何方法可以在不在窗口中绘制的情况下,将渲染上下文绘制到分配的内存中?还有没有任何方法可以从该上下文中获取帧缓冲区。如果是这样的话,我只需要调用"glTexImage2D",在"字节"参数中有指向内存的指针。别担心线程同步,我已经很擅长了…
我的问题是,有没有办法在不在窗口中绘制的情况下,让渲染上下文绘制到分配的内存中?
是。这些屏幕外区域称为帧缓冲区对象(FBO)。
还有没有任何方法可以从该上下文中获取帧缓冲区。如果是这样的话,我只需要调用"glTexImage2D",在"字节"参数中有指向内存的指针。
事实上,使用FBO可以直接渲染到纹理。然后可以使用纹理绘制到常规窗口。
我建议您不要使用多个OpenGL渲染线程。主要原因是,GPU是一个共享资源,让多个OpenGL上下文/线程同时访问它会降低性能。按顺序进行渲染。您可以使用一个单独的共享上下文。
多个OpenGL上下文可以共享它们的数据对象(纹理、顶点缓冲区对象、像素缓冲区对象);用于此目的的确切API取决于通过的操作系统。在Windows上,您可以使用wglShareLists
进行连接。抽象状态载体对象(FBO、VAO)不能共享;根据经验,任何可以上传批量数据的东西都可以在上下文之间共享。
在大多数平台上,OGL上下文绑定到窗口或视图。你可以做的下一个最好的办法是使这样的窗口/视图不可见。
但为什么你需要多个上下文呢?OpenGL(在现代卡上)确实支持对屏幕外纹理的渲染,尽管一次可能只有一个线程处于活动状态,但如果你做得正确以利用传输吞吐量,你就不需要有多个线程来处理上下文。
- Zmq 上下文 - 我应该在新线程中创建另一个上下文吗?
- 如何创建一个版本的 boost::range::transform,该版本具有用于捕获上下文的额外参数
- 是否有一个上下文表达式`a.b :: c`有意义
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 是否有一个特定的原因为什么落后的返回型不是班级的完整级别上下文
- Qopenglwidget将上下文移至另一个线程崩溃
- OpenGL在一个窗口中有多个渲染上下文
- QT和OpenGL,使用一个上下文对多个小部件
- 在渲染以外的另一个线程中初始化 OpenGL 上下文
- 系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
- 将绑定到FBO的纹理复制到另一个OpenGL上下文
- 在 MFC 中的一个设备上下文上绘制多个位图 - winapi
- 在另一个进程上下文下运行命令
- 创建不同的v8上下文,这些上下文是另一个上下文的克隆
- 我如何从Qt4传递一个OpenGL上下文
- 在一个单独的线程中管理OpenGL上下文
- 创建一个基本的OpenGl上下文
- 点击QSystemTrayIcon会在Mate桌面上弹出一个空的上下文菜单
- 是否有可能检测到一个线程在Linux中被上下文切换[挂起]
- 后期绑定的优点是什么?举一个C++中函数指针上下文的例子