shader中颜色计算方式
转载 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
是非线性变化时,会有不一样的曲线,从而导致渐变色的多样变化: