最近在研究学习计算机图形学,用shader做个光照练习,以加深记忆。
Shader "Custom/frag"
{
Properties
{
_SpecularColor("SpecularColor",color)=(1,1,1,1)
_Shininess("Shininess",range(1,32))=8
}
SubShader
{
pass{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma multi_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
float4 _SpecularColor;
float _Shininess;
struct v2f{
float4 pos: POSITION;
float3 normal: TEXCOORD1;
float4 vertex: COLOR;
};
v2f vert(appdata_base v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag(v2f IN):COLOR
{
//Ambient Color
fixed4 col = UNITY_LIGHTMODEL_AMBIENT;
//Disffuse Color
float3 N = UnityObjectToWorldNormal(IN.normal);
float3 L = normalize(WorldSpaceLightDir(IN.vertex));
float diffuseScale = saturate(dot(N,L));
col += _LightColor0 * diffuseScale;
//Specular Color Phong模型 可以用cg reflect函数求得R,这里自己实现
// float3 V = normalize(WorldSpaceViewDir(IN.vertex));
// float3 R = 2*dot(N,L)*N - L;
// float specularScale = saturate(dot(R,V));
// col += _SpecularColor * pow(specularScale,_Shininess);
//Specular Color 半角向量H, BlinnPhong模型
float3 V = normalize(WorldSpaceViewDir(IN.vertex));
float3 H = normalize(L+V);
float specularScale = saturate(dot(H,N));
col += _SpecularColor * pow(specularScale,_Shininess);
return col;
}
ENDCG
}
}
}