附件(attachment)是 帧缓冲 上真正存储像素数据的地方。
帧缓冲本身不存数据,它只是几个挂载点,每个挂载点指向一块逐像素的存储;管线按挂载点去读或写,像素值全在附件里。
可以大致将附件分为以下三类:
| 附件 | 每个像素存储的数据 | 参与哪个环节 |
|---|---|---|
| 颜色附件 | 最终颜色(RGBA) | 片元着色器的颜色输出、混合时读写 |
| 深度附件 | 当前最近的深度值 | 深度测试 |
| 模板附件 | 一个整型标记 | 模板测试 |
存储来源
概念上,附件来自两种存储:
- 纹理:渲染结果之后能当作普通纹理被采样——后处理、阴影贴图、环境光预计算都需要这一点。
- 专用渲染目标存储(renderbuffer 一类):只作为渲染目标存在,不能被采样,但布局针对"只写不读"优化过。深度、模板这类只参与测试、从不被采样的附件用它更划算。
两者不互斥,同一个帧缓冲里可以混用。同一张纹理也可以同时挂在多个帧缓冲上——附件持有的是引用,不是数据的拷贝。
颜色附件
颜色附件本身只是一个二维的数组,其中存储的数据类型可以是浮点数、整数、无符号整数,或者压缩格式。每个像素的存储空间大小也可以不同,常见的有 8 位、16 位、32 位。
注:
- 颜色附件里面填充的并不一定是颜色,它可以是任何数据,但是数据本身必须要满足帧缓冲对于附件数据格式的要求。
- 具体的附件的数据格式在 渲染API 中有所规定,比如 OpenGL 里有
GL_RGBA8、GL_RGBA16F、GL_RGBA32F等等。


