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是非线性变化时,会有不一样的曲线,从而导致渐变色的多样变化:

 

技术分享图片

 

posted @ 2020-04-23 21:59  亡命之徒ali  阅读(1025)  评论(0编辑  收藏  举报