来自知乎问题:http://www.zhihu.com/question/31133351
游戏中的惯用做法叫:调色盘色彩旋转
1. 调色盘里能变色的颜色总是固定几个位置
2. 让需要变色的位置的 RGB转换成 HSV,然后旋转 H分量旋转一定角度
3. 重新将 HSV转换为 RGB保存回调色盘
在 HSV 色彩空间中,旋转 H 分量
主要是旋转 H分量,S/V分量也可以微调,但是变色是以旋转 H为主。题主两张图片的八神,除了调色盘前面几个皮肤颜色不参与变色外,后面的衣服整体都参与了色彩旋转:
看看是不是和我上面模拟的 DEMO 差不多 — 所有衣服颜色的 H 分量 都差不多旋转了 300 多度 (除了裤子外,观察衣服颜色的变化)。可以看出,拳皇的衣服变色就是这么生成的,当然游戏自动生成好了以后,也可以让你自己微调一下。
所以这样不但有紫色八神,还能轻松有蓝色,黄色,绿色的八神。好多游戏的头发衣服的即时变色基本都是这个套路。包括 Windows下 好多界面变色也是用色彩旋转实现,只是不用调色盘了:
现代绘图,没有调色盘,依然要变色,一般是将变色的部件和不变色的部件分为两层来绘制,不变色的是一层,变色的是另外一层:
比如上面这个按钮,中间两个状态是参与变色的底图,但是还有一些不改变的,比如X和汉字,如果一起参与变色就搞笑了,所以还需要一层不变色的覆盖在上面,就是最左边那个层。所以界面变色,文字和图标不会改变。
或者根据变色不同拆分成不同的部件,让其中某一个部件变色
PS:有些地方也会用 HSL空间色彩旋转代替 HSV色彩空间旋转,差不多,看你喜好。
更多参考:OpenGL GLSL 实现色彩旋转
http://stackoverflow.com/questions/9234724/how-to-change-hue-of-a-texture-with-glsl