轉載 http://www.bubuko.com/infodetail-3114275.html
一、顏色計算
1. 加
這里要講講三原色和三基色:三原色一般指的是紅、綠、藍三種,簡稱 RGB,這是加色系。就是光源只含有特定的波段,本身就是色光,將不同顏色的光加在一起形成新的顏色。典型的例子是顯示屏,關系如下:
顯然,shader 中的顏色屬於加色系。當我們把顏色相加時,會形成新的顏色,並且顏色會往白色靠攏。顏色的混合規律符合三原色規律。
顏色相加是指光的疊加,物理上是光的強度相加。例如多個光源照射到一個表面後反射至攝像機,就可以把各個光照的反射結果相加。而題目中的例子是Phong或Blinn材質的反射模型,其意義可以算是一種擬合,把材質的反射分解成漫反射和鏡面反射,然後把兩種反射光的結果相加
2. 乘
講完三原色,再講講三基色:一般指的是顏料三原色,在純白光照射下顏色為絳紅、黃、青,簡稱 CMYK,屬於減色系。它們本身不發光,靠反光被看見。由於材料吸收特定波段的光,所以只有不被吸收的部分反射了回來。加上的顏色越多吸收的光也越多。
當我們使用乘法來做顏色混合時,其規律符合三基色的混合規律,這個時候又是減色系。
兩個顏色相乘,會算出兩個顏色中 RGB 值的乘積並合成一個新的顏色。而且顏色總會越來越暗,回不到原來的白色。通常將顏色和一個值相乘,來弱化這個顏色。
顏色相乘,其實並不是數學中常見的矢量積,而應該理解為顏色的非等比縮放。例如,光通過有色玻璃時,玻璃吸收某百分比的紅、藍、綠,就可以把光的紅藍綠強度分別乘以對應的百分比。漫反射也可以理解成材質吸收了某百分比的入射光後向各方向反射。漫反射貼圖存的其實就是
對顏色為(1,1,1,1)的光的反射率。
3. 減
單純的顏色相減似乎沒有意義,不過通過1.0-color
可以實現顏色的反相。
4. 真正的顏色混合
在圖片或視頻濾鏡中,一般不會直接使用加減乘除來做顏色混合。而是使用 mix() 函數,它的公式是:x*(1−a)+y*a
,其實也是顏色相加,但是算上了一定的比重。這樣不會因為一個白色的顏色和其他顏色相加后只有白色,現實世界中也不是這樣的。
mix()
可以做單通道或多通道的融合:
①. 簡單的顏色漸變
回到上面的案例,通過加法來表示重疊區域:
通過 mix()
來混合兩個顏色的過渡:
為什么加法和mix()
得到的過渡顏色不一樣?各位可以思考一下。
②. 復雜的顏色漸變
為 rgb 三個通道賦以不同的函數變化曲線。plot 是封裝好的畫線函數,以xy
二維笛卡爾坐標系做曲線的繪制,pct 表示x
軸的變化速率,當x
是線性變化時,曲線為直線。當x
是非線性變化時,會有不一樣的曲線,從而導致漸變色的多樣變化: