高富帅的颜色插值方法:在视觉感知线性变化的色彩空间中进行颜色插值

大多数情况下,我们会给材质提供一个Color值,来整体控制对象的颜色。一般都是使用 Color * ( TextureColor + LightColor) 来做。

颜色值动画是常规的动画特效之一,最近需要实现一个U3D版本的,查阅了一下和颜色相关的知识后,设计了多种颜色变化的方式.

 

一般的插值方式: 直接使用RGB插值

这个是程序实现最简单的插值方式,但是不够好,因为美术制作的时候其实不是想这样控制物体的颜色,而是希望“物体变绿”这样类似被绿色光照过的结果。

RGB颜色模型

三原色光模式RGB color model,又译RGB颜色模型红绿蓝颜色模型)是一种加色模型,是用三种原色──红色、绿色和蓝色的色光以不同的比例相加,以产生多种多样的色光。

RGB模型的命名来自于三种相加原色的首字母(Red(红),Green(绿),Blue(蓝))。

 相加原色

三种色光的加,红光加绿光成为黄光,黄光加蓝光成为白光

三原色光和绘画中的“三原色”不同,绘画时用三种颜色洋红色黄色青色以不同的比例配合,会产生许多种颜色,如果三种色料相加,理论上会成为黑色,但实际上是深灰色。三原色光则是红色绿色蓝色,三种光相加会成为白色光。

三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,分别对黄绿色绿色蓝紫色(或称紫罗兰色)的光最敏感(波长分别为564、534和420纳米),如果辨别黄绿色的细胞受到的刺激略大于辨别绿色的细胞,人的感觉是黄色;如果辨别黄绿色的细胞受到的刺激大大高于辨别绿色的细胞,人的感觉是红色。虽然三种细胞并不是分别对红色、绿色和蓝色最敏感,但这三种光可以分别对三种锥形细胞产生刺激。

不同的生物眼中辨别颜色的细胞并不相同,例如类眼中有四种分别对不同波长光线敏感的细胞,而一般哺乳动物只有两种,所以对它们来说只有两种原色光。

既然“三原色的原理不是出于物理原因,而是由于生理原因造成的”,那么前段所说的“用三种原色的光以不同的比例加和到一起,形成各种颜色的光”显然就不大合适。使用三原色并不足以重现所有的色彩,准确地说法应该是“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”只有那些在三原色的色度所定义的颜色三角内的颜色,才可以利用三原色的光以非负量相加混合得到。

例如,红光与绿光按某种比例复合,对三种锥状细胞刺激后产生的色觉可与眼睛对单纯的黄光的色觉等效。但决不能认为红光与绿光按某种比例复合后生成黄光,或黄光是由红光和绿光复合而成的。

 介绍RGB
 
http://zh.wikipedia.org/wiki/RGB

 

更好的插值方式:HSV or HSL 

这个是表达美术意愿最贴切的方式,大家可以自己试试。

HSLHSV(也叫HSB)是对RGB 色彩空间中点的两种有关系的表示,它们尝试描述比 RGB 更准确的感知颜色联系,并仍保持在计算上简单。

H指hue(色相)、S指saturation(饱和度)、L指lightness(亮度)、V指value(色调)、B指brightness(明度)。

  • 色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色黄色等。
  • 饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
  • 明度(V),亮度(B),取0-100%。

HSV 的图形描述
HSL 安排为双圆锥

HSLHSV(也叫HSB)是对RGB 色彩空间中点的两种有关系的表示,它们尝试描述比 RGB 更准确的感知颜

HSL 和 HSV 二者都把颜色描述在圆柱坐标系内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间是的灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”,“色调”或“明度”。

这两种表示在用目的上类似,但在方法上有区别。二者在数学上都是圆柱,但 HSV(色相,饱和度,色调)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心),HSL 在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)。注意尽管在 HSL 和 HSV 中“色相”指称相同的性质,它们的“饱和度”的定义是明显不同的。

因为 HSL 和 HSV 是设备依赖的 RGB 的简单变换,(h, s, l) 或 (h,s,v) 三元组定义的颜色依赖于所使用的特定红色绿色蓝色加法原色”。每个独特的 RGB 设备都伴随着一个独特的 HSL 和 HSV 空间。但是 (h, s, l) 或 (h,s,v) 三元组在被约束于特定 RGB 空间比如sRGB 的时候就变成明确的了。

HSV 模型在 1978 年由埃尔维·雷·史密斯创立,它是三原色光模式的一种非线性变换

介绍HSV/HSL
http://zh.wikipedia.org/zh-hans/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

 

上述两种插值方式都是在数学上线性变化的,但是不是人类视觉感知上的线性变化,因为人眼对绿色的辨识敏感度要高于蓝色和红色。

现在介绍下高富帅的颜色插值方法:视觉感知线性变化的色彩空间中进行颜色插值

CIE 1931 XYZ 色彩空间

颜色感知的研究中,CIE 1931 XYZ 色彩空间(也叫做CIE 1931 色彩空间)是其中一个最先采用数学方式来定义的色彩空间,它由国际照明委员会(CIE)于1931年创立。

CIE XYZ 色彩空间是从 1920 年代后期 W. David Wright (Wright 1928) 和 John Guild (Guild 1931) 做的一系列实验中得出的。他们的实验结果合并到了 CIE RGB 色彩空间的规定中,CIE XYZ 色彩空间再从它得出。

人类眼睛有对于短(S)、中(M)和长(L)波长光的感受器(叫做视锥细胞),所以原则上只要三个参数便能描述颜色感觉了。在三色加色法模型中,如果某一种颜色和另一种混合了不同份量的三种原色的颜色,均使人类看上去是相同的话,我们把这三种原色的份量称作该颜色的三色刺激值。 CIE 1931 色彩空间通常会给出颜色的三色刺激值,并以X、Y和Z来表示。

色彩空间是指任何一种替每个颜色关联到三个数(或三色刺激值)的方法,CIE 1931 色彩空间就是这种色彩空间之一。但是 CIE XYZ 色彩空间是特殊的,因为它是基于人类颜色视觉的直接测定,并充当很多其他色彩空间的定义基础。

在 CIE XYZ 色彩空间中,三色刺激值并不是指人类眼睛对短、中和长波(S、M 和 L)的反应,而是一组称为 X、Y 和 Z 的值,约略对应于红色绿色蓝色(但要留意 X、Y 和 Z 值并不是真的看起来是红、绿和蓝色,而是从红色、绿色和蓝色导出来的参数),并使用 CIE 1931 XYZ 颜色匹配函数来计算。两个由多种不同波长的光混合而成的光源可以表现出同样的颜色,这叫做“异谱同色”(metamerism)。当两个光源对标准观察者(CIE 1931 标准色度观察者)有相同的视现颜色的时候,它们即有同样的三色刺激值,而不管生成它们的光的光谱分布如何。

介绍CIE1931
http://zh.wikipedia.org/wiki/CIE_1931_%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

 

CIE 1976 (L*, a*, b*) 色彩空间

Lab 色彩空间是颜色-对立空间,带有维度 L 表示亮度,ab 表示颜色对立维度,基于了非线性压缩的CIE XYZ 色彩空间坐标。
Hunter 1948 L, a, b 色彩空间的坐标是 L, a 和 b。[1][2] 但是,Lab 经常用做 CIE 1976 (L*, a*, b*) 色彩空间的非正式缩写(也叫做 CIELAB,它的坐标实际上是 L*, a*和 b*)。所以首字母 Lab 自身是有歧义的。这两个色彩空间在用途上有关联,但在实现上不同。

Lab 色彩空间是颜色-对立空间,带有维度 L 表示亮度,ab 表示颜色对立维度,基于了非线性压缩的CIE XYZ 色彩空

 

L*a*b* 色彩空间,只展示可充入 sRGB 色域的颜色(因此可以显示在典型的计算机显示器上)。每个正方形的每个轴取值于 -128 到 128。

不像 RGBCMYK 色彩空间,Lab 颜色被设计来接近人类视觉。它致力于感知均匀性,它的 L 分量密切匹配人类亮度感知。因此可以被用来通过修改 a 和 b 分量的输出色阶来做精确的颜色平衡,或使用 L 分量来调整亮度对比。这些变换在 RGB 或 CMYK 中是困难或不可能的,它们建模物理设备的输出,而不是人类视觉感知。

因为 Lab 空间比计算机显示器、打印机甚至比人类视觉的色域都要大,表示为 Lab 的位图比 RGB 或 CMYK 位图获得同样的精度要求更多的每像素数据。在 1990 年代,这时的计算机硬件和软件通常受限于存储和操纵 8 位/通道的位图,从 RGB 图象到 Lab 之间的来回转换是有损耗的操作。对于现在常见的 16 位/通道支持,这就不是问题了。

在软件和文献中对这个缩写的明确使用。

  • Adobe Photoshop 中,图象编辑使用的“Lab 模式”是 CIELAB D50。[6]
  • ICC Profile 中,“Lab 色彩空间”用做 profile 连接空间的是 CIELAB D50。[4]
  • TIFF 文件中,可以使用 CIELAB 色彩空间。[7]
  • PDF 文档中,“Lab 色彩空间”是 CIELAB。

介绍L*a*b* 
http://zh.wikipedia.org/wiki/Lab_%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

 

在了解上述知识之后,转换方法也就出来了:

1、美术指定2个颜色 StartColor 和 EndColor

2、RGB 转 XYZ

3、XYZ 转 Lab

4、在Lab做线性插值

5、转回XYZ

6、转回RGB,修改material的Color属性.

 

RGB 与 XYZ 的转换

CIE 特殊委员会确定了标准变换如下:

 

XYZ 与 CIE L*a*b* (CIELAB) 的转换

CSDN的复制又抽了,大家看原文的公式吧
http://zh.wikipedia.org/wiki/Lab_%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4


试验已经成功了,公式没有任何问题,大家安心使用吧。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值