您的位置:首页 > 其它

<Shader>phong 光照模型和 blinn phong 模式

2017-05-31 14:55 429 查看
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

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: