OpenGL的对象和对象模型

  1. 缓冲区对象(Buffer Objects)

在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):用于在变换反馈模式激活时捕获经过变换的图元顶点属性,它们包含状态信息以及捕获属性所引用的缓冲区对象。

值得注意的是,不是所有对象都是可共享的。例如,帧缓冲区对象和顶点数组对象等容器对象包含对其他对象的引用,但它们本身不支持共享。而像缓冲区对象、纹理对象和采样器对象则可以跨上下文共享。

你可能感兴趣的:(OpenGL,图形渲染)