【问题标题】:OpenGL multiple rendering contexts in one windowOpenGL 多个渲染上下文在一个窗口中
【发布时间】:2014-02-08 18:05:35
【问题描述】:

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

【问题讨论】:

    标签: c++ multithreading opengl rendering


    【解决方案1】:

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

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

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

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

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

    多个OpenGL上下文可以共享它们的数据对象(纹理、顶点缓冲对象、像素缓冲对象);用于此的确切 API 取决于操作系统。在 Windows 上,您使用 wglShareLists 进行连接。抽象状态载体对象(FBO、VAO)虽然不能共享;根据经验,您可以将批量数据上传到的所有内容都可以在上下文之间共享。

    【讨论】:

    • 好的,我知道 gpu 是共享资源,但我更喜欢这样做。因为所有的绘图都是 2D 的(项目是一个 GUI),所以我首先做的是有一个指向 32 位整数数组的指针,然后从子线程直接绘制到那个“缓冲区”,然后把它变成一个纹理需要刷新屏幕的时间。即使使用 50 200x200,帧速率仍然超过 750 fps。我只是想要一种更简单的方法来在这些线程中制作高级图形。我宁愿不分享上下文。非常感谢您的帮助!
    【解决方案2】:

    在大多数平台上,OGL 上下文绑定到窗口或视图。下一个最好的办法是使此类窗口/视图不可见。

    但是为什么你还需要多个上下文呢? OpenGL(在现代显卡上)确实支持渲染到屏幕外纹理,尽管一次可能只有一个线程处于活动状态,但如果您正确地利用传输吞吐量,您实际上并不需要多个线程与上下文。

    【讨论】:

    • OpenGL 上下文不以任何方式绑定到特定窗口。随时可以将上下文重新绑定到另一个窗口。
    • 很明显,我的意思是你不能同时将两个上下文绑定到同一个窗口。
    • 其实你可以,如果每个上下文是从不同的线程绑定的。
    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2015-01-19
    相关资源
    最近更新 更多