赞
踩
公式详解 参考文献 : http://blog.csdn.net/idfaya/article/details/6770414
向作者白哦大十二分的敬意。
因为是做游戏的,所以才会有这方面的需求,我们的引擎采用的脚本是 lua, 我是通过lua将数据转换后为游戏材质属性赋值,因为下面的脚本运行速率并不是太高,所以就先在脚本中实现,方便调试。
--[[
* RGB颜色模型转化为HSV的颜色模型数据
* h,s,v 色相,饱和度, 色调(明度)
* 返回值 hsvValue h(0-360),s(0-255) v(0-255)
* @param colorRGB 颜色数值{r=0,g=255,b=100,a=255}, 数值部分0-255
]]
function _G.RGBConvertToHSV(colorRGB)
local r,g,b = colorRGB.r, colorRGB.g, colorRGB.b;
local h,s,v = 0,0,0;
local max1 = math.max(r, math.max(g,b));
local min1 = math.min(r, math.min(g,b));
if max1 == min1 then
h=0;
else
if r == max1 then
if g >= b then
h = 60 * (g-b) / (max1-min1);
else
h = 60 * (g-b) / (max1-min1) + 360;
end
end
if g == max1 then
h = 60 * (b-r)/(max1-min1) + 120;
end
if b == max1 then
h = 60 * (r-g)/(max1-min1) + 240;
end
end
if max1 == 0 then
s = 0;
else
s = (1- min1 / max1) * 255;
end
v = max1;
local hsvValue = {
h = h;
s = s;
v= v;
};
return hsvValue;
end
--[[
* HSV to RGB
* h,s,v 色相,饱和度,明度(色调)
* 返回值 colorValue 颜色值 (0-1)规范化数值
* @paream colorHSV 颜色数值{h,s,v}, h(0-360) s(0-255) v(0-255)
]]
function HSVConvertToRGB( colorHSV )
local cr,cg,cb = 0,0,0;
colorHSV.s = colorHSV.s /255;
colorHSV.v = colorHSV.v / 255;
if( colorHSV.s == 0 ) then
cr,cg,cb = colorHSV.v, colorHSV.v, colorHSV.v;
else
colorHSV.h = colorHSV.h /60;
local i = math.floor(colorHSV.h);
local f = colorHSV.h - i;
local a = colorHSV.v * ( 1 - colorHSV.s );
local b = colorHSV.v * ( 1 - colorHSV.s * f );
local c = colorHSV.v * ( 1 - colorHSV.s * (1 - f ) );
if i== 0 then
cr,cg,cb = colorHSV.v, c, a;
elseif i == 1 then
cr,cg,cb = b, colorHSV.v, a;
elseif i == 2 then
cr,cg,cb = a, colorHSV.v, c;
elseif i == 3 then
cr,cg,cb = a, b, colorHSV.v;
elseif i == 4 then
cr,cg,cb = c, a, colorHSV.v;
else
cr,cg,cb = colorHSV.v, a, b;
end
end
local rgbValue = {r = cr, g = cg, b= cb, a=1};
return rgbValue;
end
--[[
*HSL颜色值转换为RGB.
* h, s, l 色相,饱和度,亮度
* h(0-360) s(0-255) l(0-255);
* 返回的 color 数值 [0,1]
* @param hslValue
]]
function HSLConvertToRGB(hslValue)
local h,s,l = hslValue.h, hslValue.s, hslValue.l;
h = h/360;
s = s/255;
l = l/255;
local r, g, b;
if s == 0 then
r, g, b = l, l, l;
else
local hue2rgb = function(p, q, t)
if t < 0 then t = t +1; end
if t > 1 then t = t -1; end
if t < 1/6 then return p + (q - p) * 6 * t; end
if t < 1/2 then return q; end
if t < 2/3 then return p + (q - p) * (2/3 - t) * 6; end
return p;
end
local q = l < 0.5 and l * (1 + s) or l + s - l * s;
local p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
end
local rgbValue = {r = r, g = g, b= b, a=1};
return rgbValue;
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。