Bootstrap

OpenGL之帧缓冲

本文主要包括帧缓冲的基本概念、函数使用,以及引出离屏渲染和后处理的介绍。

概要

所谓帧缓冲是做什么用的,就是用来存储渲染数据的地方,可以理解为显存。几何数据(顶点坐标、纹理坐标等)和纹理经过一系列渲染管道最终计算出屏幕上的所有像素点,它们需要一个地方来存放,这个地方就是帧缓冲。帧缓冲中的数据会被显示器读取来刷新显示。

OpenGL可以同时存在多个帧缓冲,创建窗口时OpenGL会自动创建一个默认帧缓冲,专门用于该窗口的渲染显示。其它的需要用户创建自定义帧缓冲。

帧缓冲中包括有颜色缓冲区、深度缓冲区、模板缓冲区这三类缓冲区。

我用下图介绍一下帧缓冲的用处,以深度缓冲为例。
在由三维映射至二维空间时,Z坐标将会被转换为深度值写入深度缓冲中,测试和混合阶段执行后,像素点的颜色值会被写入帧缓冲的颜色附件中,最终帧缓冲会显示到显示器上。
在这里插入图片描述

帧缓冲

附件

要注意,帧缓冲并不包含缓冲数据的内存,它只是包含颜色缓冲区、深度缓冲区、模板缓冲区的附加点。这些对象才是真正的缓冲,它们被称之为附件。绑定到帧缓冲的这个过程叫做“附加”。

例如下图中,帧缓冲中包含有多个附加点可将真正的缓冲区附加上去。

在这里插入图片描述

OpenGL定义,一个帧缓冲对象包括有

  1. 多个颜色缓冲附件,
  2. 一个深度缓冲附件,
  3. 一个模板缓冲附件。

可以通过一个结构体来理解它(仅用于理解):

struct FrameBuffer
{
    int[] color;
    int depth;
    int stencil;
};

注意到颜色缓冲区可以是一个列表,这是由OpenGL定义的,允许用户同一时间将颜色缓冲区渲染到多个目标(multiple render targets,MRT)。

MRT是什么意思呢?
比方说,你可以附加两个颜色附件,然后在这两个附件上渲染出整个场景。可能一个是完整版场景,一个低采样版场景,分别作不同用途,可能其中带有遮罩或者用于其它后处理。

此外OpenGL定义,一个完整的帧缓冲对象至少要有一个颜色附件,否则将无法被使用。

函数


创建帧缓冲和创建VBO时非常类似地。

void glGenFramebuffers(GLsizei n, GLuint* ids)
void glDeleteFramebuffers(GLsizei n, const GLuint* ids)

glGenFramebuffers第一个参数是创建帧缓冲的数目,第二参数是存储帧缓冲区对象的ID。<

;