之前实现的高光反射采用的是Blinn光照模型
Blinn光照模型:
Specular=直射光 * pow(max (cosx,0),光照系数)x为反射光和视野方向的夹角
更为常用的是Blinn-Phong光照模型
Blinn-Phong光照模型:
公式同上,x变为法线 和 平行光与视野方向的平分线 的夹角
Shader "Custom/Shader04"{ Properties{ _Color("_Color",Color) = (1,1,1,1) //物体本身的颜色 _SpecularColor("_SpecularColor",Color)=(1,1,1,1) //高光的颜色 _Gloss("Gloss",Range(8,200)) = 10 //控制高光光圈大小 } SubShader{ Pass{ //定义LightMode以得到unity的内置光照变量 Tags{"LightMode" = "ForwardBase"} CGPROGRAM //unity内置文件引入,要使用unity的内置变量 #include "Lighting.cginc" #pragma vertex vert #pragma fragment frag fixed4 _Color; half _Gloss; fixed4 _SpecularColor; struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 position : SV_POSITION; fixed3 color : COLOR; }; v2f vert(a2v v) { v2f f; //UNITY_MATRIX_MVP 坐标从模型空间转剪裁空间 f.position = UnityObjectToClipPos(v.vertex); //法线的单位向量:_World2Object 把一个方向从世界空间转模型空间 fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject)); //光的单位向量:对于每个顶点来说,平行光位置就是光的方向 _WorldSpaceLightPos0 取得平行光的位置 fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); //取得漫反射颜色 fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0) * _Color.rgb; //当前点到摄像机的方向 fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(v.vertex, unity_WorldToObject).xyz); //高光反射 fixed3 halfDir = normalize(viewDir+lightDir); fixed3 specular = _LightColor0.rgb * pow(max(dot(normalDir, halfDir), 0), _Gloss) *_SpecularColor; //环境光 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb; //颜色叠加 f.color = diffuse + specular + ambient; return f; } fixed4 frag(v2f f) : SV_Target{ return fixed4(f.color,1); } ENDCG } } FallBack "Diffuse" }
Blinn(左)与Blinn-Phong(右)实现效果对比:
Unity Shader------Blinn-Phong光照模型
猜你喜欢
转载自blog.csdn.net/love_phoebe/article/details/104086041
今日推荐
周排行