顏色是一個(gè)很神奇的主題,它并不那么“理性”化,對(duì)于程序猿來說顏色可能就是用RGB三個(gè)數(shù)字來代表的一個(gè)數(shù)集而已,但事實(shí)卻不是這樣。
顏色是“感性”的東西
顏色不等于RGB!因?yàn)轭伾粌H僅只是由三個(gè)色值組成,影響顏色的還有物體的材質(zhì),物體的光照,人眼和人腦的感覺,甚至是心情!而且顏色還跟環(huán)境有很大關(guān)系,相同的圖片在環(huán)境不同的時(shí)候看起來也不一樣,比如下面的圖片:

所以顏色是“感性的”,如何使顏色看起來“柔和”是一門很大的學(xué)問,本文就不做深究,感興趣的同學(xué)請(qǐng)查看文章最后的相關(guān)連接。
如何選擇“協(xié)調(diào)”的顏色板
顏色并沒有絕對(duì)的好看和不好看,如何搭配才是重點(diǎn),如何選擇配在一起看起來舒服的顏色板就很重要了。如果沒有顏色板,單純的隨機(jī)生成顏色,你得到的很可能是下面這樣很丑的一些顏色:
color = new Color(Random(), Random(), Random())

如果用這樣一些顏色在你的游戲里就可以毀了你的游戲,顏色太土了!
黃金分割法
首先需要解決隨機(jī)顏色導(dǎo)致的色彩亮度不統(tǒng)一的問題,從上面的顏色可以看出,有的顏色太暗,有的顏色又太亮。為了解決這個(gè)問題,我們需要使用HSV色彩空間來代替RGB。

- 色相(H)是色彩的基本屬性,就是平常所說的顏色名稱,如紅色、黃色等。
- 飽和度(S)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數(shù)值。
- 明度(V),亮度(L),取0-100%。
在確定S和V的前提下,只改變H,得到的顏色在亮度和飽和度上就都是一樣的,看起來就更加協(xié)調(diào)。
根據(jù)Wiki上RGB到HSV的變換公式,下面是一個(gè)lua版的代碼段。
但如果只是這樣,我們得到的顏色可能相差的參差不齊,有的很相近而有的差別又很大,如何解決這個(gè)問題呢?答案就是黃金分割法。 很難解釋為什么黃金分割的法則在很多地方都有用,但它就是有用,試試看吧。


這樣得到的顏色就好看多了。
相關(guān)鏈接
本文只列出了一種取色方案,黃金分割法只適用于對(duì)比度要求比較高的情況,還有很多其他配色方案請(qǐng)查看下面的相關(guān)連接。
- HSL和HSV色彩空間
- How to Choose Colours Procedurally (Algorithms)
- How to Generate Random Colors Programmatically
- Color Series: Color Theory and The Color Wheel
最后給出一個(gè)顏色搭配的經(jīng)典案例:Tiny Wing
