Skip to content

默认帧缓冲区 (Default Framebuffer)

默认帧缓冲区是创建 OpenGL 时附带的帧缓冲区。它与 OpenGL 上下文一起创建。与帧缓冲区对象(FBO)类似,默认帧缓冲区是一系列图像。与 FBO 不同,其中一个图像通常代表你在屏幕某部分实际看到的内容。

创建

默认帧缓冲区在构建 OpenGL 上下文时创建。默认帧缓冲区的所需属性传递给上下文创建函数,创建上下文时会考虑这些属性。上下文构建是平台特定的,因此如何指定所需属性也是平台特定的。

默认帧缓冲区包含多个图像,基于创建方式。所有默认帧缓冲区图像会自动调整为输出窗口的大小。

颜色缓冲区 (Color Buffers)

默认帧缓冲区最多包含 4 个颜色缓冲区:

缓冲区说明
GL_FRONT_LEFT前左缓冲区
GL_BACK_LEFT后左缓冲区
GL_FRONT_RIGHT前右缓冲区
GL_BACK_RIGHT后右缓冲区

左右缓冲区用于立体渲染。大多数消费级显卡无法使用这些进行立体 3D 可视化。

立体渲染

如果不进行立体渲染,则只有左缓冲区处于活动状态。尝试从右缓冲区读取或绘制将失败。

多缓冲区别名

默认帧缓冲区的 4 个颜色图像有表示多个缓冲区的别名:

别名实际图像
GL_LEFTGL_FRONT_LEFT
GL_RIGHTGL_FRONT_RIGHT
GL_FRONTGL_FRONT_LEFT
GL_BACKGL_BACK_LEFT
GL_FRONT_AND_BACKGL_FRONT_LEFT

这些别名仅允许在 glDrawBuffer(注意不是 glDrawBuffers)和 glReadBuffer 中使用。

读取规则

用于读取操作时,多缓冲区别名指定单个缓冲区:它指定所覆盖缓冲区中最前、最左的缓冲区。

双缓冲 (Double Buffering)

前缓冲区和后缓冲区代表双缓冲帧缓冲区:

  • 前缓冲区:你在屏幕上看到的内容
  • 后缓冲区:通常渲染到的图像

当用户希望渲染的图像变为可见时,调用平台特定的缓冲区交换命令,这实际上将后缓冲区数据传输到前缓冲区。

不建议操作

不建议渲染到前缓冲区或从前缓冲区读取。

缓冲区交换不必是真正的交换。OpenGL 只要求后缓冲区的内容进入前缓冲区,可以通过真正的交换或从后缓冲区复制到前缓冲区来实现。

立体渲染有两个后缓冲区和两个前缓冲区,交换时两者都会切换。

深度缓冲区 (Depth Buffer)

默认帧缓冲区可以具有深度缓冲区,用于深度测试。深度缓冲区的精度通常是传递给上下文创建函数的参数之一。默认帧缓冲区深度缓冲区的名称(用于查询)是 GL_DEPTH

立体渲染注意

立体渲染仍然使用一个深度缓冲区,必须在左右缓冲区之间共享,因此在渲染到左缓冲区和右缓冲区之间可能需要发出清除操作。

模板缓冲区 (Stencil Buffer)

默认帧缓冲区可以具有模板缓冲区,用于模板测试。模板位数通常是传递给上下文创建函数的参数之一。默认帧缓冲区模板缓冲区的名称(用于查询)是 GL_STENCIL

立体渲染注意

立体渲染仍然使用一个模板缓冲区,必须在左右缓冲区之间共享,因此在渲染到左缓冲区和右缓冲区之间可能需要发出清除操作。

像素所有权测试 (Pixel Ownership Test)

由于默认帧缓冲区由 OpenGL 外部资源拥有,默认帧缓冲区的某些像素可能不被 OpenGL 拥有,因此 OpenGL 无法写入这些像素。指向这些像素的片元会在管线此阶段被丢弃。

典型场景

如果渲染的窗口被另一个窗口部分遮挡,被遮挡的像素不再由 OpenGL 拥有,因此无法通过所有权测试。覆盖这些像素的任何片元都会被丢弃。这也包括帧缓冲区清除操作。

此测试影响对默认帧缓冲区的渲染。当渲染到帧缓冲区对象(FBO)时,所有片元都通过此测试。

多重采样帧缓冲区

默认帧缓冲区也可以是多重采样的。样本数通常指定为上下文创建参数。

已移除的缓冲区图像

已弃用

本节描述的 API 已从核心 OpenGL 3.1 及以上版本移除(在 OpenGL 3.0 中仅被弃用)。建议不要在程序中使用这些功能。

在兼容上下文或 OpenGL 3.0 及以下版本中,默认帧缓冲区可以包含:

  • 辅助颜色图像 (GL_AUXi):与窗口大小相同的离屏颜色缓冲区,可以像任何其他图像一样渲染和位块传送
  • 累积缓冲区:可用于在渲染时执行某些计算

基于 OpenGL Wiki 的本地化项目