OpenGL 上下文(OpenGL Context)是一个包含了 OpenGL 所有状态信息的环境,是你与 GPU 进行任何 OpenGL 调用之前必须建立的基础。
简单来说,它是“OpenGL 的运行容器”,你在程序中执行的所有 OpenGL 命令,都是在“当前上下文”中生效的。
OpenGL 是一个状态机,它没有“全局变量”或“全局执行环境”,你不能“在任何地方”调用 glDrawArrays()
就能绘制图形。
你必须在一个已经激活的上下文中调用,OpenGL 才知道你希望它在哪里渲染、使用什么资源。
OpenGL 上下文包含的状态和资源具体指什么?
状态信息: 当前清除颜色(glClearColor)、混合模式(glBlendFunc)、视口(glViewport)等。
资源: 已创建的纹理(Texture)、缓冲对象(VBO/FBO)、着色器程序(Program)、VAO 等。在 OpenGL 中,一个线程可以拥有多个上下文(OpenGL Context),分别代表不同的 OpenGL 状态集,但是一个线程在同一时间只能绑定(make current)一个上下文。
多个上下文可以同时存在,但只能分别绑定在不同线程上,也就是一个线程在同一时间只能绑定一个上下文。
上下文的资源(纹理、VBO、Shader、Program)能不能共享仅仅取决于上下文是否通过共享的方式创建的。
共享上下文时可以共享的资源:
- 纹理;
- shader;
- program 着色器程序;
- buffer 类对象,如 VBO、 EBO、 RBO 等
不可以共享的资源:
- FBO 帧缓冲区对象(不属于 buffer 类);
- VAO 顶点数组对象(不属于 buffer 类)。
这里解释下,在不可以共享的资源中,FBO 和 VAO 属于资源管理型对象,FBO 负责管理几种缓冲区,本身不占用资源,VAO 负责管理 VBO 或 EBO ,本身也不占用资源。
一般上下文销毁了,与之相关的资源也会被回收。
但是如果你建立了共享的多个上下文,OpenGL 会为 share-group 内的每个对象维护引用计数。只要 share-group 里至少还有 1 个上下文,引用计数大于零,对象就不会真正销毁。
进技术交流群,扫码添加我的微信:Byte-Flow

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/57978.html