参考<unity shader编程精要>
_Gloss越大高光区域越小
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "MyShader/Specular/SpecularVertexLevel"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_SpecularColor("SpecularColor", color) = (1,1,1,1)//材质高光反射颜色
_DiffuseColor("DiffuseColor", color) = (1,1,1,1)//材质漫反射颜色
_Gloss("Gloss", Range(8,256)) = 8
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct a2v
{
float4 vertex : POSITION;
float3 normal : Normal;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed3 color : COLOR;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _SpecularColor;
fixed4 _DiffuseColor;
float _Gloss;
v2f vert (a2v v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
fixed3 worldNormal = normalize( mul( v.normal , (float3x3)unity_WorldToObject ) );
fixed3 wolrdLightDir = normalize(_WorldSpaceLightPos0.xyz);
//fixed3 reflectWorldDir = normalize(-wolrdLightDir.xyz - 2.0 * (dot(worldNormal.xyz,-wolrdLightDir.xyz))*worldNormal.xyz);
fixed3 reflectWorldDir = normalize(reflect(-wolrdLightDir, worldNormal));
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT;
fixed3 diffuse = _LightColor0.rgb*_DiffuseColor.rgb*saturate(dot(worldNormal,wolrdLightDir));
fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb*pow(saturate(dot(viewDir, reflectWorldDir)), _Gloss);
/*环境光 漫反射 镜面反射 */
o.color = ambient + diffuse + specular;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = fixed4( i.color , 1);
return col;
}
ENDCG
}
}
}
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
Shader "MyShader/Specular/SpecularPixLevel"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DiffuseColor( "DiffuseColor", color) = (1,1,1,1)
_SpecularColor("SpecularColor", color) = (1,1,1,1)
_Gloss("Gloss", Range(8,256)) = 8
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
Tags{ "LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct a2v
{
float4 vertex : POSITION;
float3 normal : Normal;
};
struct v2f
{
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float4 pos : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _DiffuseColor;
fixed4 _SpecularColor;
float _Gloss;
v2f vert (a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse = _LightColor0.rgb*_DiffuseColor.rgb*saturate(dot(worldNormal, worldLightDir));
fixed3 worldViewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
fixed3 worldReflectDir = normalize( reflect(-worldLightDir, worldNormal) );
fixed3 specular = _LightColor0.rgb*_SpecularColor.rgb* pow(saturate(dot(worldReflectDir, worldViewDir)), _Gloss);
return fixed4( ambient + diffuse + specular, 1.0);
}
ENDCG
}
}
}