- 同步对象(Sync Objects)
- 查询对象 Query Objects
- OpenGL共享对象和多上下文 Shared Objects and Multiple Contexts
- 缓冲区对象(Buffer Objects)
- 着色器对象(Shader Objects)
- 程序对象(Program Objects)
- 程序管线对象(Program Pipeline Objects)
- 统一变量(Uniform Variables)
- 顶点数组对象和绘图命令 Vertex Specification and Drawing Commands
在OpenGL规范中,定义了多种不同类型的对象,应用程序可以通过相应的命令创建、修改、查询和销毁这些对象实例,其数量通常仅受可用图形内存限制。每个对象实例与特定的上下文绑定,并共同决定了诸如着色器、缓冲区数据、纹理图像、帧缓冲区内容以及同步栅栏和计时查询等状态信息,这些状态信息在GL绘图操作中起到关键作用。
-
管理以及删除对象
大多数对象类型遵循一个通用的对象管理模型。通常通过以"Gen"开头的命令生成未使用的名称。生成的名称并不立即对应一个实际的对象实例;对象是在通过绑定上下文中的生成名称时才被创建。例如,当调用
BindBuffer
并将GenBuffers
返回的缓冲区对象名称传递给它时,就会为该缓冲区分配资源并创建一个关联的缓冲区对象。此外,还存在一些函数可以直接创建并返回初始化完毕的对象名称。对象删除是通过调用特定于该对象类型的删除命令实现的,例如DeleteBuffers用于删除缓冲对象。一旦对象被删除,其名称会再次标记为未使用以便重新生成。若尝试删除不存在或已标记为未使用的对象名称,则会被静默忽略。(如果对象在被当前GL上下文使用时被删除,它的名称会立即变为未使用状态,并且某些类型的对象会自动从当前上下文的绑定点解除绑定。然而,底层对象只有在其不再被任何上下文使用时才会真正被删除。)
多个上下文之间可以共享部分服务器状态,这需要通过窗口系统绑定API来实现。除特定对象类型外,所有上下文的状态都是各自独立的。
各个对象的具体功能如下:
-
缓冲区对象(Buffer Objects):存储客户端数据到服务器内存中,用于分配、初始化、读取和写入固定大小的内存区域,并在一定条件下允许客户端和服务器同时访问。
-
着色器对象(Shader Objects):包含着色器程序源代码或二进制代码,这些代码将在OpenGL定义的不同可编程阶段(如顶点或片段着色器)中执行。
-
程序对象(Program Objects):通过链接多个着色器对象形成,包含了所有定义可执行着色器程序所需的信息。
-
程序管线对象(Program Pipeline Objects):为每个可编程阶段提供单独的程序对象绑定点,允许独立程序处理各个阶段,从而增加组合不同着色器的灵活性。
-
纹理对象(Texture Objects):包含一系列基于图像元素集合构建的纹理图像,并带有采样参数和纹理采样方式的状态,可在着色器中进行纹理采样操作。
-
采样器对象(Sampler Objects):封装了控制着色器访问纹理时采样方式的那部分纹理对象状态,与纹理对象结合使用可以复用同一采样器状态于多个不同的纹理上。
-
渲染缓冲区对象(Renderbuffer Objects):包含单个格式化的图像,该图像可用于离屏渲染。
-
帧缓冲区对象(Framebuffer Objects):封装了帧缓冲区状态,包括颜色、深度和模板缓冲区,这些缓冲区由渲染缓冲区对象或纹理对象附着而成。
-
顶点数组对象(Vertex Array Objects):代表一组顶点属性集,这些属性作为缓冲区对象数据存储中的数组输入至顶点着色器。
-
变换反馈对象(Transform Feedback Objects):用于在变换反馈模式激活时捕获经过变换的图元顶点属性,它们包含状态信息以及捕获属性所引用的缓冲区对象。
-
查询对象(Query Objects): 用于返回关于一系列GL命令执行过程的信息。
-
同步对象(Sync Objects):在OpenGL中扮演着同步原语的角色,它们是对事件完成状态的一种表示,可以被测试或等待其完成。
值得注意的是,不是所有对象都是可共享的。例如,帧缓冲区对象和顶点数组对象等容器对象包含对其他对象的引用,但它们本身不支持共享。而像缓冲区对象、纹理对象和采样器对象则可以跨上下文共享。