在计算机中颜色信息有两个重要参数,一是通道,二是位深。 更多详见:glTexImage2D - OpenGL 4 Reference Pages
通道
指的是用于表示一个像素颜色所需独立数值的数量,决定了数据的存储格式,更多的通道能够表示更丰富的色彩。
单通道
每个像素用1个数值表示,常用于灰度图、位图等。在3D领域常用单通道图片存储某个材质属性数据。
双通道
虽然不存在广泛使用的“双通道”颜色模式,但在某些特定的应用场景下,可能会使用自定义的双通道模式来满足特殊需求。OpenGL有提供GL_RG。
三通道
每个像素用3个数值表示,我们常见的彩色图像数据就是由RGB3个通道构成。在存储时也可以有反向顺序:BGR。
在3D领域也常将3张单通道的图片合并成1张三通道的图片以节省资源,3个通道可以分别表示不同的材质属性数据。
四通道
每个像素用4个数值表示,我们常见的透明彩色图像数据就是由RGBA4个通道构成。在存储时有反向顺序:ABGR。
在3D领域也常将4张单通道的图片合并成1张四通道的图片以节省资源,4个通道可以分别表示不同的材质属性数据。
OpenGL中的颜色通道(格式)
| 格式常量 | 分类 | 通道数 | 通道含义 | 主要用途 |
|---|---|---|---|---|
| 标准颜色格式 | ||||
GL_RED |
单通道 | 1 | R = 红通道 | 灰度图/单通道纹理 |
GL_RG |
双通道 | 2 | R = 红, G = 绿 | 法线贴图/特殊效果纹理 |
GL_RGB |
三通道 | 3 | R = 红, G = 绿, B = 蓝 | 标准彩色纹理 |
GL_BGR |
三通道 | 3 | B = 蓝, G = 绿, R = 红 | Windows兼容图像处理 |
GL_RGBA |
四通道 | 4 | R = 红, G = 绿, B = 蓝, A = 透明 | 带透明度纹理/UI元素 |
GL_BGRA |
四通道 | 4 | B = 蓝, G = 绿, R = 红, A = 透明 | DirectX兼容图像处理 |
| 深度/模板格式 | ||||
GL_STENCIL_INDEX |
模板缓冲 | 1 | 模板值 | 模板测试/轮廓效果 |
GL_DEPTH_COMPONENT |
深度缓冲 | 1 | 深度值 | 深度测试/阴影映射 |
GL_DEPTH_STENCIL |
混合缓冲 | 2 | D = 深度值, S = 模板值 | 延迟渲染/高精度深度+模板组合 |
标准颜色格式添加_INTEGER后缀可特指整数型颜色格式 |
位深
也称为色彩深度或像素深度,指的是存储每个颜色通道的信息所需的比特数,也决定了数据所使用的数据类型,更高的位深能够表示更精确的颜色。以下以OpenGL支持的位深为例:
| 位数 | 数据类型 | 描述 | 值范围/标准 | 典型用途 |
|---|---|---|---|---|
| 1位 | - | 1比特(纯黑/纯白) | True/False | 二值化图像、掩码、字体位图 |
| 8位 | GL_UNSIGNED_BYTE | 8位无符号整数 | 0 到 255 | 8位RGB/RGBA图像、LUT索引 |
| GL_BYTE | 8位有符号整数 | -128 到 127 | 法线贴图(部分格式) | |
| 16位 | GL_UNSIGNED_SHORT | 16位无符号整数 | 0 到 65535 | 深度缓冲、医学影像 |
| GL_SHORT | 16位有符号整数 | -32768 到 32767 | 高度图、音频波形数据 | |
| GL_HALF_FLOAT | 16位半精度浮点数 | IEEE 754-2008 | HDR图像、实时渲染中间缓冲 | |
| 32位 | GL_UNSIGNED_INT | 32位无符号整数 | 0 到 4294967295 | 高精度掩码、体素数据 |
| GL_INT | 32位有符号整数 | -2147483648 到 2147483647 | 科学计算数据 | |
| GL_FLOAT | 32位单精度浮点数 | IEEE 754 | HDR渲染、物理模拟、深度计算 |
打包格式 Packed Formats
多个通道数据被打包到单个整数中,通过位掩码提取各通道。这样便可支持更多的位深。
命名规则:<类型>_<通道1位数>_<通道2位数>_...[_REV]
_REV 后缀:表示通道顺序反向存储。
| 格式名称 | 类型 | 位数分配 | 存储顺序(高位→低位) |
|---|---|---|---|
| RGB格式 | |||
| GL_UNSIGNED_BYTE_3_3_2 | 8-bit | R(3) G(3) B(2) | [R7 R6 R5 G4 G3 G2 B1 B0] |
| GL_UNSIGNED_BYTE_2_3_3_REV | 8-bit | B(3) G(3) R(2) | [B7 B6 B5 G4 G3 G2 R1 R0] |
| GL_UNSIGNED_SHORT_5_6_5 | 16-bit | R(5) G(6) B(5) | [R15-R11] [G10-G5] [B4-B0] |
| GL_UNSIGNED_SHORT_5_6_5_REV | 16-bit | B(5) G(6) R(5) | [B15-B11] [G10-G5] [R4-R0] |
| RGBA格式 | |||
| GL_UNSIGNED_SHORT_4_4_4_4 | 16-bit | R(4) G(4) B(4) A(4) | [R15-R12] [G11-G8] [B7-B4] [A3-A0] |
| GL_UNSIGNED_SHORT_4_4_4_4_REV | 16-bit | A(4) B(4) G(4) R(4) | [A15-A12] [B11-B8] [G7-G4] [R3-R0] |
| GL_UNSIGNED_SHORT_5_5_5_1 | 16-bit | R(5) G(5) B(5) A(1) | [R15-R11] [G10-G6] [B5-B1] [A0] |
| GL_UNSIGNED_SHORT_1_5_5_5_REV | 16-bit | A(1) B(5) G(5) R(5) | [A15] [B14-B10] [G9-G5] [R4-R0] |
| GL_UNSIGNED_INT_8_8_8_8 | 32-bit | R(8) G(8) B(8) A(8) | [R31-R24] [G23-G16] [B15-B8] [A7-A0] |
| GL_UNSIGNED_INT_8_8_8_8_REV | 32-bit | A(8) B(8) G(8) R(8) | [A31-A24] [B23-B16] [G15-G8] [R7-R0] |
| GL_UNSIGNED_INT_10_10_10_2 | 32-bit | R(10) G(10) B(10) A(2) | [R31-R22] [G21-G12] [B11-B2] [A1-A0] |
| GL_UNSIGNED_INT_2_10_10_10_REV | 32-bit | A(2) B(10) G(10) R(10) | [A31-A30] [B29-B20] [G19-G10] [R9-R0] |
GPU内部颜色模式
- OpenGL:[内部纹理存储格式 internalformat](/posts/内部纹理存储格式 internalformat)