这里有一篇文章:
OpengGL 中的同步及资源共享 | 柯幽 (keyou.github.io)
然后是实际使用。
windows上面创建共享上下文,之前一直失败,没有找到原因,今天测试成功。原因就是:要共享的 OpenGL 上下文,创建好之后,什么也不要修改,马上共享。这样创建的纹理就能共享使用了。
多窗口,可以看到各个窗口新创建的纹理的 ID 已经按公共顺序排列了,而不是每个窗口单独的顺序。
然后关掉两个窗口,共享的纹理就失效了:
2024-03-07 00:36:38
关于 OpenGL 多窗口,或者多线程的理解,OpenGL 是单线程 API,所有线程、打开的窗口里面,同时只能有一个 Context 操作。对于想实现所谓多线程操作的程序,一个线程去加载资源,上传到 gpu,然后单独的渲染线程去渲染就好。gpu 渲染本身是“多线程”方式执行的,绘制一个图像的时候,所有 gpu 处理单元是一起工作的,和 cpu 那种一核有难八核围观的概念不一样。而且,不管你 d3d、gl、vk,想象的那种“多线程”,程序不会更快多少。比如多个窗口或者线程渲染,一个窗口渲(线程)染 1000 帧,两个窗口(线程)最多就只可能有 500 帧。OpenGL 的短板之一,是没有把 vk 的 CmdBuffer 加入标准,对于 drawcall 太多的情况下,cpu 单线程提交,会影响性能。vk 在drawcall 很多的情况下,可以选择多个线程录制 cmd,最后单独线程提交渲染。想象中的那种“多线程渲染”,还会涉及 gpu 和 cpu 各种同步问题。
Windows 下,每创建一个新的 Context,使用 wglShareLists(Context0, NewContext) 来共享上下文,可以实现一个线程里面加载资源,另外一个线程只管显示,这已经是 OpenGL 这个 API 的最好方式了。
程序代码:(这个代码只供参考,用的是 C++Builder 2010 + 一些库写的)