Shader "chicai/LightMode"
{
Properties
{
_DiffuseIntensity("Diffuse Intensity", float) = 1
_SpecularIntensity("Specular Intensity", float) = 1
_Gloss("Gloss", float) = 1
}
SubShader
{
Tags { "RenderType"="Opaque"}
LOD 100
Pass
{
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
half3 normal:NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
half3 worldNormal:TEXCOORD1;
float3 worldPos:TEXCOORD2;
};
half _DiffuseIntensity;
float _SpecularIntensity;
float _Gloss;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = 0;
fixed4 Ambient = unity_AmbientSky;
half Kd = _DiffuseIntensity;
fixed4 LightColor = _LightColor0;
fixed3 N = normalize( i.worldNormal );
fixed3 L = _WorldSpaceLightPos0;
fixed4 diffuse = Ambient + Kd * LightColor * max(0,dot(N,L));
col += diffuse;
//Phong高光
//float3 reflectDir = reflect(-L, N);
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);
// fixed4 specularColor = _LightColor0 * _SpecularIntensity * (pow( max( dot(reflectDir,viewDir) ,0),_Gloss) );
// col += specularColor;
//Bilnn-Phong高光
fixed4 specularColor = _LightColor0 * _SpecularIntensity * (pow( max(dot(i.worldNormal, normalize(L+viewDir)),0), _Gloss));
col += specularColor;
return col;
}
ENDCG
}
Pass
{
Tags { "LightMode"="ForwardAdd" }
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdadd //Builtin keywords used: POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE
#pragma skip_variants DIRECTIONAL POINT_COOKIE DIRECTIONAL_COOKIE//剔除不要的变体
#include "UnityCG.cginc"
#include "Lighting.cginc"//_LightColor0 _WorldSpaceLightPos0
#include "AutoLight.cginc"//unity_WorldToLight _LightTexture0 衰减贴图
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
half3 normal:NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
half3 worldNormal:TEXCOORD1;
float3 worldPos:TEXCOORD2;
};
half _DiffuseIntensity;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.uv = v.uv;
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 LightColor = _LightColor0;
fixed3 N = normalize( i.worldNormal );
fixed3 L = _WorldSpaceLightPos0;
//float3 lightCoord = mul(unity_WorldToLight, float4(i.worldPos.xyz,1)).xyz;//距离灯光位置 点光源的
//float atten = tex2D(_LightTexture0, dot(lightCoord,lightCoord));
UNITY_LIGHT_ATTENUATION(atten, 0, i.worldPos);//光照衰减 第二参数计算阴影的
fixed4 diffuse = LightColor * max(0,dot(N,L)) * atten;
return diffuse;
}
ENDCG
}
}
}