游戏中角色变色如何实现?

来自知乎问题:http://www.zhihu.com/question/31133351 

游戏中的惯用做法叫:调色盘色彩旋转

image

1. 调色盘里能变色的颜色总是固定几个位置
2. 让需要变色的位置的 RGB转换成 HSV,然后旋转 H分量旋转一定角度
3. 重新将 HSV转换为 RGB保存回调色盘

image

在 HSV 色彩空间中,旋转 H 分量

主要是旋转 H分量,S/V分量也可以微调,但是变色是以旋转 H为主。题主两张图片的八神,除了调色盘前面几个皮肤颜色不参与变色外,后面的衣服整体都参与了色彩旋转:

image

看看是不是和我上面模拟的 DEMO 差不多 — 所有衣服颜色的 H 分量 都差不多旋转了 300 多度 (除了裤子外,观察衣服颜色的变化)。可以看出,拳皇的衣服变色就是这么生成的,当然游戏自动生成好了以后,也可以让你自己微调一下。

所以这样不但有紫色八神,还能轻松有蓝色,黄色,绿色的八神。好多游戏的头发衣服的即时变色基本都是这个套路。包括 Windows下 好多界面变色也是用色彩旋转实现,只是不用调色盘了:
image

现代绘图,没有调色盘,依然要变色,一般是将变色的部件和不变色的部件分为两层来绘制,不变色的是一层,变色的是另外一层:

image
比如上面这个按钮,中间两个状态是参与变色的底图,但是还有一些不改变的,比如X和汉字,如果一起参与变色就搞笑了,所以还需要一层不变色的覆盖在上面,就是最左边那个层。所以界面变色,文字和图标不会改变。
或者根据变色不同拆分成不同的部件,让其中某一个部件变色

坦克身子:参与变色 (不同的国家会旋转成不同的颜色) 
image

坦克炮管:不参与变色(都是一样的) 
image

PS:有些地方也会用 HSL空间色彩旋转代替 HSV色彩空间旋转,差不多,看你喜好。

更多参考:OpenGL GLSL 实现色彩旋转

http://stackoverflow.com/questions/9234724/how-to-change-hue-of-a-texture-with-glsl

Loading

About skywind

Putty 本无树,MinGW 亦非台
This entry was posted in 图形编程 and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *