在手机游戏中,如果又想要光照,又想性能好,可以考虑用顶点光照,虽然效果上差了一点,但是如果物体属于低多边形,或者物体比较小,这两种情况下可以考虑用这种光照效果。
顺便还可以给模型加顶点颜色,直接使用顶点颜色来控制模型的显示。
Shader "_Game/Blinn-Phong Vertex Light"
{
Properties
{
_Specular("Specular",Color) = (1,1,1,1)
_Gloss("Gloss",Range(1.0,256)) = 20
}
SubShader
{
Pass
{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Specular;
float _Gloss;
struct a2v{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 color:COLOR;
};
struct v2f{
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
v2f vert(a2v v)
{
v2f o;
float3 worldPos = normalize(mul(unity_ObjectToWorld,v.vertex).xyz);
//顶点信息转换至世界空间
o.pos = UnityObjectToClipPos(v.vertex);
//得到环境光部分
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
//顶点法线转换至世界空间
fixed3 worldnormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));
//光源方向
fixed3 worldlight = normalize(UnityWorldSpaceLightDir(worldPos));//normalize(_WorldSpaceLightPos0.xyz);
//漫反射部分
fixed3 diffuse = _LightColor0.rgb * v.color * saturate(dot(worldnormal,worldlight));
//计算反射方向
fixed3 reflectDir = normalize(reflect(-worldlight,worldnormal));
//计算视角方向
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));//normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld,v.vertex).xyz);
//得到高光发射部分
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir,viewDir)),_Gloss);
o.color = ambient + diffuse + specular;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return fixed4(i.color,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
上面是像素光照,下面这个角色是顶点光照。可以明显看出区别