顏色是一個很神奇的主題,它并不那么“理性”化,對于程序猿來說顏色可能就是用RGB三個數字來代表的一個數集而已,但事實卻不是這樣。
顏色是“感性”的東西
顏色不等于RGB!因為顏色不僅僅只是由三個色值組成,影響顏色的還有物體的材質,物體的光照,人眼和人腦的感覺,甚至是心情!而且顏色還跟環境有很大關系,相同的圖片在環境不同的時候看起來也不一樣,比如下面的圖片:
所以顏色是“感性的”,如何使顏色看起來“柔和”是一門很大的學問,本文就不做深究,感興趣的同學請查看文章最后的相關連接。
如何選擇“協調”的顏色板
顏色并沒有絕對的好看和不好看,如何搭配才是重點,如何選擇配在一起看起來舒服的顏色板就很重要了。如果沒有顏色板,單純的隨機生成顏色,你得到的很可能是下面這樣很丑的一些顏色:
color = new Color(Random(), Random(), Random())
如果用這樣一些顏色在你的游戲里就可以毀了你的游戲,顏色太土了!
黃金分割法
首先需要解決隨機顏色導致的色彩亮度不統一的問題,從上面的顏色可以看出,有的顏色太暗,有的顏色又太亮。為了解決這個問題,我們需要使用HSV色彩空間來代替RGB。
HSV cylinder
- 色相(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