附件(attachment)是 帧缓冲 上真正存储像素数据的地方。

帧缓冲本身不存数据,它只是几个挂载点,每个挂载点指向一块逐像素的存储;管线按挂载点去读或写,像素值全在附件里。

可以大致将附件分为以下三类:

附件 每个像素存储的数据 参与哪个环节
颜色附件 最终颜色(RGBA) 片元着色器的颜色输出、混合时读写
深度附件 当前最近的深度值 深度测试
模板附件 一个整型标记 模板测试

存储来源

概念上,附件来自两种存储:

  • 纹理:渲染结果之后能当作普通纹理被采样——后处理、阴影贴图、环境光预计算都需要这一点。
  • 专用渲染目标存储(renderbuffer 一类):只作为渲染目标存在,不能被采样,但布局针对"只写不读"优化过。深度、模板这类只参与测试、从不被采样的附件用它更划算。

两者不互斥,同一个帧缓冲里可以混用。同一张纹理也可以同时挂在多个帧缓冲上——附件持有的是引用,不是数据的拷贝。

颜色附件

颜色附件本身只是一个二维的数组,其中存储的数据类型可以是浮点数、整数、无符号整数,或者压缩格式。每个像素的存储空间大小也可以不同,常见的有 8 位、16 位、32 位。

注:

  1. 颜色附件里面填充的并不一定是颜色,它可以是任何数据,但是数据本身必须要满足帧缓冲对于附件数据格式的要求。
  2. 具体的附件的数据格式在 渲染API 中有所规定,比如 OpenGL 里有 GL_RGBA8、GL_RGBA16F、GL_RGBA32F 等等。