前言
“色彩空间”一词源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。
简言之,色彩空间就是用来描述颜色的的坐标空间。而在GLSL
里面,片元着色器最终接受的颜色属于RGBA
模型。
常用的颜色模型
RGB(A)颜色模型
该模型的原理是光学三原色(红、绿、蓝)进行不同比例的混合可以得到其他任何颜色。
R
:代表红色分量;
G
:代表绿色分量;
B
:代表蓝色分量;
A
:代表透明通道分量;
很明显,RGB
色彩空间为一个立方体。该立方体内的每一个点都是不同的颜色值,而GLSL
中每一个分量的取值范围为[0, 1]。而一般常用的RGB
为24
位,即每个分量取值为8
位,也就是28=256种取值([0, 255]),最后能够得到224个颜色值。
HSB颜色模型
HSB
(也称HSV
)颜色模型,是一种更符合直觉、更易于调色的颜色模型;
H
(Hue
):指色相,即单纯的颜色;取值范围为[0, 360°]。
S
(Saturation
):指饱和度,饱和度越高则颜色越纯;取值范围为[0, 100%]。
B
(Brightness
):指明度,又称为值(Value
);取值范围为[0, 100%]。
HSB
色彩空间为一个圆柱体:
HSB
色彩空间坐标实际上是一个极坐标系;H
分量为角度,S
分量为弧长,B
分量则是垂直于H-S
极坐标系。
HSB转RGB
hifpqt(r,g,b)=⌊60h⌋ mod 6=60h−hi=v∗(1−s)=v∗(1−f∗s)=v∗(1−(1−f)∗s)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧(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
一个HSB转RGB的GLSL
实现:
1 2 3 4 5 6 7 8 9 10
|
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
hsvNotes:minmax=⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧0°,60°∗max−ming−b,60°∗max−ming−b+360°,60°∗max−minb−r+120°,60°∗max−minr−g+240°, if max=min if max=r and g≥b if max=r and g<b if max=g if max=b={0,maxmax−min=1−maxmin, if max=0 otherwise=max=min(r,g,b)=max(r,g,b)
参考文档