Unityshader 颜色相加和颜色相乘
--颜色的RGB值都是[0,1]的,颜色的相乘,必然会使颜色值减小,物体更暗,颜色相加则会使物体更亮;
--计算光照反射时,经过物体材质的反射,光的颜色必然是经过削弱的,所以计算光照反射时一般是颜色相乘
--计算贴图采样和环境光颜色时,也是用了颜色相乘,计算两个颜色值混合时,一般是相乘,在现实生活中,把不同颜色的颜料混合在一起时,颜色最终会变为黑色,这说明他们的颜色值越来越小
--计算不同类型的光照叠加时,一般使用颜色相加
Step函数, Lerp函数,SmoothStep函数,Clamp函数
Val=Step(a,b)
If(a<=b){
Val=1;
}else{
Val=0;
}
Lerp(a,b,w)
{
Return a+(b-a)*w
}
Clamp(x,min,max){
If(xmax){
Return max;
}
Return x;
}
SmoothStep(min,max,x){
X=calmp((x-min)/(max-min)),0.0,1.0);
Return x*x*(3-2*x);
}
if else 和 阶梯函数step
--由于GPU程序是并行计算,if语句和Switch语句条件分支会执行2个分支,如果有些像素采取一个分支,有些像素不采用另一个分支,则所有片段都会执行2个分支,但只是在每个片段应该采取的分支上写入寄存器,对于追去高并行的GPU,分支是必须要同步的,那么慢的case就会造成短板效应; 另外,if等流程控制语句对GPU来讲有较高的指令开销;
实现原理: 菲涅尔效果叠加到自发光
现实表现:
落雪掉落在物体表面上, 落雪的方向一般是垂直向下, 物体的表面如果和落雪方向接近垂直则更加容易落雪, 也就是说落雪方向和表面的法线的夹角越小越容易落雪;
落雪的数学判断:
value = dot(落雪方向,顶点法线)=cos(夹角) , 夹角越小,value约趋近于1
使用value和传入的SnowDepth比较,返回0或者1,表示 这个顶点是否落雪
实现原理:使用Time节点修改TilingAndOffset的UV偏移,叠加水纹理和漫反射纹理
颜色渐变
实现原理:使用模型定点的Y分量对渐变色进行Lerp
实现原理:使用兰伯特光照采样渐变纹理, 混合满反色纹理和渐变纹理,最后叠加自发光
--------------------------------------
--------------------Fade