高光反射:会受到相机方向的影响 specular=直射光 *pow(max(cosθ,0),10);
shader效果 类似于一个亮点
//反射光的方向,unity方法reflect() 反射光是平行光的反射 -lightDir 法线是normalDir 得到的是光照的反射方向 reflectDir
fixed3 reflectDir = normalize(reflect(-lightDir, normalDir));
//相机位置减去对应光照点的坐标,得到viewDir的是视野的方向
fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz - mul(v.vertex, unity_WorldToObject).xyz);
// 得到夹角。光照方向的反射方向和视野方向 进行点乘
fixed3 speacular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(reflectDir, viewDir),0),_Gloss);
高光反射中的半兰伯特方式:
//这个是半兰伯特公式(2个的叉乘)*0.5+0.5 ,用于游戏方面比较多,因为背光的材质不容易发黑
float halfLambert = dot(normalDir, lightDir)*0.5 + 0.5;
//取得漫反射的颜色
fixed3 diffuse = _LightColor0.rgb*halfLambert*_Diffuse.rgb;//dot()用来取得函数的点乘//_LightColor0用来取得平行光的颜色
高光反射的升级版本 BlinnPhong
//取到系统内置的环境光线 unity_lightmodel_ambient.rgb
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
//unity_WorldToObject从世界空间转换到模型空间
fixed3 normalDir = normalize(f.worldNormal);
//_WorldSpaceLightPos0用来取得平行光的位置
//fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//normalize用来把一个向量单位化。
//下面的是对上面的进行更改,利用CG函数来实现
fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex));
float halftemp = dot(normalDir, lightDir)*0.5 + 0.5;
//取得漫反射的颜色
fixed3 diffuse = _LightColor0.rgb*halftemp*_Diffuse.rgb;//dot()用来取得函数的点乘//_LightColor0用来取得平行光的颜色
//相机位置减去对应光照点的坐标,得到viewDir的是视野的方向
fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz - f.worldVertex);
//这个是求相机视野方向和光的方向的平分线的值
fixed3 halfDir = normalize(viewDir + lightDir);
// 得到夹角。 法线跟平分线进行点乘
fixed3 speacular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir, halfDir),0),_Gloss);
漫反射 :不会受到相机方向的影响 Diffuse=直射光颜色 *max(0,cos夹角(光和法线的夹角)) coso=光方向*法线方向
求叉乘用dot(法线,灯光);
fixed3 diffuse = _LightColor0.rgb*max(dot(normalDir, lightDir), 0)*_Diffuse.rgb;