色彩空间(颜色模型)

前言

“色彩空间”一词源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。

简言之,色彩空间就是用来描述颜色的的坐标空间。而在GLSL里面,片元着色器最终接受的颜色属于RGBA模型

常用的颜色模型

RGB(A)颜色模型

该模型的原理是光学三原色(红、绿、蓝)进行不同比例的混合可以得到其他任何颜色。

  • R:代表红色分量;
  • G:代表绿色分量;
  • B:代表蓝色分量;
  • A:代表透明通道分量;

很明显,RGB色彩空间为一个立方体。该立方体内的每一个点都是不同的颜色值,而GLSL中每一个分量的取值范围为[0, 1][0,\ 1]。而一般常用的RGB24位,即每个分量取值为8位,也就是28=2562^8 = 256种取值([0, 255][0,\ 255]),最后能够得到2242^{24}个颜色值。

img

HSB颜色模型

HSB(也称HSV)颜色模型,是一种更符合直觉、更易于调色的颜色模型;

  • HHue):指色相,即单纯的颜色;取值范围为[0, 360°][0,\ 360\degree]
  • SSaturation):指饱和度,饱和度越高则颜色越纯;取值范围为[0, 100%][0,\ 100\%]
  • BBrightness):指明度,又称为值(Value);取值范围为[0, 100%][0,\ 100\%]

HSB色彩空间为一个圆柱体:

img

HSB色彩空间坐标实际上是一个极坐标系H分量为角度S分量为弧长B分量则是垂直于H-S极坐标系。

HSB转RGB

hi=h60 mod 6f=h60hip=v(1s)q=v(1fs)t=v(1(1f)s)(r,g,b)={(v,t,p), if hi=0(q,v,p), if hi=1(p,v,t), if hi=2(p,q,v), if hi=3(t,p,v), if hi=4(v,p,q), if hi=5\begin{aligned} h_i &= \lfloor \frac{h}{60} \rfloor \ mod\ 6 \\ f &= \frac{h}{60} - h_i \\ p &= v * (1 - s) \\ q &= v * (1 - f * s) \\ t &= v * (1 - (1 - f) * s) \\ (r, g, b) &= \begin{cases} (v, t, p),\ \text{if }h_i = 0 \\ (q, v, p),\ \text{if }h_i = 1 \\ (p, v, t),\ \text{if }h_i = 2 \\ (p, q, v),\ \text{if }h_i = 3 \\ (t, p, v),\ \text{if }h_i = 4 \\ (v, p, q),\ \text{if }h_i = 5 \\ \end{cases} \end{aligned}

一个HSB转RGB的GLSL实现:

1
2
3
4
5
6
7
8
9
10
//  Function from Iñigo Quiles
// https://www.shadertoy.com/view/MsS3Wc
vec3 hsb2rgb( in vec3 c ){
vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0),
6.0)-3.0)-1.0,
0.0,
1.0 );
rgb = rgb*rgb*(3.0-2.0*rgb);
return c.z * mix(vec3(1.0), rgb, c.y);
}

RGB转HSB

h={0°, if max=min60°gbmaxmin, if max=r and gb60°gbmaxmin+360°, if max=r and g<b60°brmaxmin+120°, if max=g60°rgmaxmin+240°, if max=bs={0, if max=0maxminmax=1minmax, otherwisev=maxNotes:min=min(r,g,b)max=max(r,g,b)\begin{aligned} h &= \begin{cases} 0\degree,&\ \text{if } max = min \\ 60\degree * \frac{g - b}{max - min},&\ \text{if } max = r\text{ and } g \ge b \\ 60\degree * \frac{g - b}{max - min} + 360\degree,&\ \text{if } max = r\text{ and } g < b \\ 60\degree * \frac{b - r}{max - min} + 120\degree,&\ \text{if } max = g \\ 60\degree * \frac{r - g}{max - min} + 240\degree,&\ \text{if } max = b \end{cases} \\ s &= \begin{cases} 0,&\ \text{if } max = 0 \\ \frac{max - min}{max} = 1 - \frac{min}{max},&\ \text{otherwise} \end{cases} \\ v &= max \\ \text{Notes:} \\ min &= min(r, g, b) \\ max &= max(r, g, b) \end{aligned}

参考文档