Unity Shader------Blinn-Phong光照模型

之前实现的高光反射采用的是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(右)实现效果对比:

发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/104086041