OpenGL 共享上下文使用场景?有哪些资源可以共享?
多线程渲染或者跨窗口渲染,共享上下文可以使得多个线程、窗口之间能够共享 OpenGL 对象(如纹理、shader 等)和状态信息,避免了在多个上下文之间频繁地进行数据拷贝和同步操作,减少资源消耗,提高性能。
可以共享的资源:
纹理;
shader;
program 着色器程序;
buffer 类对象,如 VBO、 EBO、 RBO 等 。
不可以共享的资源:
FBO 帧缓冲区对象(不属于 buffer 类);
VAO 顶点数组对象(不属于 buffer 类)。
这里解释下,在不可以共享的资源中,FBO 和 VAO 属于资源管理型对象,FBO 负责管理几种缓冲区,本身不占用资源,VAO 负责管理 VBO 或 EBO ,本身也不占用资源。
注意,每个线程同时只能绑定(eglMakeCurrent)一个 Context ,但可以按顺序切换不同 Context。
帧缓冲区对象 FBO 的作用?
FBO 即帧缓冲区对象,实际上是一个可添加缓冲区的容器,用于管理渲染到纹理或渲染到屏幕之外的其他图像缓冲区的过程。
FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它仅且提供了 3 种附着(Attachment