颜色是一个很神奇的主题,它并不那么“理性”化,对于程序猿来说颜色可能就是用RGB三个数字来代表的一个数集而已,但事实却不是这样。
颜色是“感性”的东西
颜色不等于RGB!因为颜色不仅仅只是由三个色值组成,影响颜色的还有物体的材质,物体的光照,人眼和人脑的感觉,甚至是心情!而且颜色还跟环境有很大关系,相同的图片在环境不同的时候看起来也不一样,比如下面的图片:
所以颜色是“感性的”,如何使颜色看起来“柔和”是一门很大的学问,本文就不做深究,感兴趣的同学请查看文章最后的相关连接。
如何选择“协调”的颜色板
颜色并没有绝对的好看和不好看,如何搭配才是重点,如何选择配在一起看起来舒服的颜色板就很重要了。如果没有颜色板,单纯的随机生成颜色,你得到的很可能是下面这样很丑的一些颜色:
color = new Color(Random(), Random(), Random())
如果用这样一些颜色在你的游戏里就可以毁了你的游戏,颜色太土了!
黄金分割法
首先需要解决随机颜色导致的色彩亮度不统一的问题,从上面的颜色可以看出,有的颜色太暗,有的颜色又太亮。为了解决这个问题,我们需要使用HSV色彩空间来代替RGB。
- 色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
- 饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
- 明度(V),亮度(L),取0-100%。
在确定S和V的前提下,只改变H,得到的颜色在亮度和饱和度上就都是一样的,看起来就更加协调。
根据Wiki上RGB到HSV的变换公式,下面是一个lua版的代码段。
但如果只是这样,我们得到的颜色可能相差的参差不齐,有的很相近而有的差别又很大,如何解决这个问题呢?答案就是黄金分割法。 很难解释为什么黄金分割的法则在很多地方都有用,但它就是有用,试试看吧。
这样得到的颜色就好看多了。
相关链接
本文只列出了一种取色方案,黄金分割法只适用于对比度要求比较高的情况,还有很多其他配色方案请查看下面的相关连接。
- HSL和HSV色彩空间
- How to Choose Colours Procedurally (Algorithms)
- How to Generate Random Colors Programmatically
- Color Series: Color Theory and The Color Wheel
最后给出一个颜色搭配的经典案例:Tiny Wing