phong 光照模型和 blinn phong 模式

Shader "Custom/Lighting001" {

	Properties{

		_diffuseColor("diffuse :",color) = (1,1,1,1)
		_specularColor("specular:",color) = (1,1,1,1)
		_shimininess("specular power",range(1,100)) = 10
	}

	SubShader{
		pass{
			CGPROGRAM
			#pragma vertex verx
			#pragma fragment frag
			#include "unitycg.cginc"
			#include "Lighting.cginc"  


			float4 _diffuseColor;
			float4 _specularColor;
			fixed _shimininess;

			struct  v2f{
				float4 pos:POSITION;
				float3 normal:NORMAL;
				float4 vertex:TEXCOORD0;
			};

			v2f verx(appdata_base  IN)
			{
				v2f OUT;
				OUT.pos = mul(UNITY_MATRIX_MVP,IN.vertex);
				OUT.normal = IN.normal;
				OUT.vertex = IN.vertex;

				return OUT;
			}

			fixed4 frag(v2f  IN):COLOR
			{
				float4 color = UNITY_LIGHTMODEL_AMBIENT;

				float3 N = UnityObjectToWorldNormal(IN.normal);
				float3 L = WorldSpaceLightDir(IN.vertex);
				L = normalize(L);

				float  diffuseScale = saturate(dot( N,L));
				float3 diffuse = _diffuseColor.rgb * _LightColor0.rgb * diffuseScale;

				//不用reflect方法進行求的specular

				float3 R = normalize(2 * dot(N,L) * N - L);
				float3 V = WorldSpaceViewDir(IN.vertex);
				V = normalize(V);

				//不用公式自己計算出來的光照強度
				//float specularScale = dot(R,V);
				//float3  specular=  _specularColor.rgb * _LightColor0.rgb * pow(max(0.0,specularScale),_shimininess);

				//Phong 光照模型
//				float3 reflectDir = reflect(-L,V);
//				float3  specular=  _specularColor.rgb * _LightColor0.rgb * pow(max(0.0,dot(reflectDir,V)),_shimininess);
//
				//Blinn phong 光照模型
				float3 H = L + V;
				H = normalize(H);


				float HNDot = dot(H,N);
				float3  specular=  _specularColor.rgb * _LightColor0.rgb * pow(max(0.0,HNDot),_shimininess);

				return color + float4(diffuse,1.0)+ float4(specular,1.0) ;

			}

			ENDCG
			

		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章