目前市面上普遍使用的是RGB调色方案是,云端或APP端直接下发sRGB(如255,255,255),然后简单粗暴的换算为pwm占空比,或者灰度值。这导致部分混色不准确,肉眼可见的颜色差别明显。
本文提供了一套新的方案。
先通过R、G、B灯珠规格书,得到灯珠的色坐标,以及最大流明值。
色坐标 | x | y | Y |
R | 0.6900 | 0.3100 | 50 |
G | 0.1900 | 0.6100 | 150 |
B | 0.1530 | 0.0278 | 30 |
通过混色定理,黑色三角形内部的颜色,都可以通过这三颗灯珠混出来,色坐标与流明无关。
云端或APP端还是下发sRGB值+亮度值,然后在设备端换算为期望的xm,ym色坐值,然后通过算法计算出对应的占空比或灰度值。
占空比计
xr = 0.6900 //R灯珠参数
yr = 0.3100
Yr = 50
xg = 0.1900 //G灯珠参数
yg = 0.6100
Yg = 150
xb = 0.1530 //B灯珠参数
yb = 0.0278
Yb = 40
Ym = 30 //给定一个固定值
//x,y为期望的色坐标
Dr = ((yg-yb)*(xb-x)+(y-yb)*(xg-xb)) / ((yg-yb)*(xb-xr)+(yr-yb)*(xg-xb)) * (yr * Ym) / (y * Yr)
Dg = ((yb-yr)*(xr-x)+(y-yr)*(xb-xr)) / ((yb-yr)*(xr-xg)+(yg-yr)*(xb-xr)) * (yg * Ym) / (y * Yg)
Db = ((yg-yr)*(xr-x)+(y-yr)*(xg-xr)) / ((yg-yr)*(xr-xb)+(yb-yr)*(xg-xr)) * (yb * Ym) / (y * Yb)
下发亮度加入gamma校准,此处gamma值设置为2.6,亮度范围为0~100。
Y = ((Y/100)^2.6)*100 //亮度调节校准
灰度值计算,如果灰度为8位,最大就为255。
N = MAX(Dr,Dg,Db)
N = 1/N
Dr = 255 * Dr * N * Y
Dg = 255 * Dg * N * Y
Db = 255 * Db * N * Y
把最后得到的值给驱动,就完成了。
本文只是从色坐标换算到占空比。前面还需要sRGB换算为色坐标,公式参考http://www.easyrgb.com/en/math.php
另外中间涉及到超色域转换,请看我另外一篇文章