摘自冯乐乐的《unity shader 入门精要》
直接上代码了,我写了一些注释的:
Shader "Custom/SpecularVertxLevelMat" {
Properties
{
_Diffuse("Diffuse",Color)=(1,1,1,1)
//控制材质的高光反射颜色
_Specular("Specular",Color)=(1,1,1,1)
//控制高光区域的大小
_Gloss("Gloss",Range(8.0,256))=20
}
SubShader
{
Pass
{
Tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Diffuse;
fixed4 _Specular;
float _Gloss;
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
v2f vert(a2v v)
{
v2f o;
//Transform the vertex from object space to projection space
//把对象局部的顶点投射到空间中
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
//Get ambient term
//获取局部光照模型
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
//Transform the normal fram object space to world space
//把局部法线转换到空间法线
fixed3 worldNormal = normalize(mul(v.normal,(float3x3)_World2Object));
//Get the light direction in world space
//获取空间中的光照方向
fixed worldLightDir = normalize (_WorldSpaceLightPos0.xyz);
//Compute diffuse term
//计算漫反射
fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb * saturate(dot(worldNormal,worldLightDir));
//Get the reflect direction in the world space
//获取空间中光照的反射方向
fixed3 reflectDir = normalize(reflect(-worldLightDir,worldNormal));
//Get the view direction in world space
//在世界空间得到视图方向
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(_Object2World,v.vertex).xyz);
//Compute specular term
//计算反射
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 "Specular"
}
效果图如下,左边的是unity创建出来,没有做任何改动的胶囊体,右边是shader的显示。(PS:犹如黑暗中的萤火虫)