Lambert光照模型(环境光+漫反射):
Shader "Custom/ShaderLambert" {
SubShader {
Pass{
CGPROGRAM
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
struct params{
float4 Pos:POSITION;
float4 Col:COLOR;
};
params vert(appdata_base ab)
{
params pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT; //环境光
float3 N;
float3 L;
//求法向量
//N = normalize(UnityObjectToWorldNormal(ab.normal)); //系统自带UnityObjectToWorldNormal:将模型法向量转换到世界
N = normalize(ab.normal); //自行处理法向量
N = mul(float4(N,0),_World2Object).xyz; //由于此处存在法向量非等比转换问题,故需要将法向量乘以它的逆转矩阵,如右侧
//求光向量
//L = normalize(WorldSpaceLightDir(ab.vertex)); //系统自带WorldSpaceLightDir:传入顶点求世界方向的光向量
L = normalize(_WorldSpaceLightPos0); //自行处理光向量,此处用mul,因为法向量和光向量变其中一个让他们统一就行
float DotNL = saturate(dot(N,L)); //计算漫反射夹角
pms.Col += _LightColor0 * DotNL; //环境光+漫反射
return pms;
}
float4 frag(params INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}
Phong光照模型(环境光+漫反射+镜面高光):
Shader "Custom/ShaderPhong_Vertex" {
Properties{
_SpecularColor("SpecularColor",color) = (1,1,1,1)
}
SubShader {
Pass{
CGPROGRAM
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
float4 _SpecularColor;
struct parmas{
float4 Pos:POSITION;
float4 Col:COLOR;
};
parmas vert(appdata_base ab)
{
parmas pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT; //环境光
float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
float3 L =normalize(WorldSpaceLightDir(ab.vertex)).xyz;
float DotNL = saturate(dot(N,L)); //转化为[0,1]之内
pms.Col = pms.Col+_LightColor0 * DotNL; //环境光 + 漫反射
//通过Reflect 获取反射光线
float3 R = normalize(reflect(-WorldSpaceLightDir(ab.vertex),N)); //使用reflect() 其中光源要指向顶点
//float3 R = normalize(2*dot(N,L)*N-L); //手动求反射R
float3 V = normalize(WorldSpaceViewDir(ab.vertex));
float DotRV = max(0,dot(R,V)+0.1); //此处保留
pms.Col = pms.Col*0.8+_SpecularColor*DotRV*0.1; //环境光+漫反射+镜面反射高光
return pms;
}
float4 frag(parmas INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}
Blinn-Phong光照模型(环境光+漫反射+半角镜面高光):
Shader "Custom/ShaderBlinnPhong_Vertex" {
Properties{
_SpcularColor("SpecularColor",color) = (1,1,1,1)
}
SubShader {
Pass{
CGPROGRAM
#include "unitycg.cginc"
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
float4 _SpcularColor;
struct parmas
{
float4 Pos:POSITION;
float4 Col:COLOR;
};
parmas vert(appdata_base ab)
{
parmas pms;
pms.Pos = mul(UNITY_MATRIX_MVP,ab.vertex);
pms.Col = UNITY_LIGHTMODEL_AMBIENT; //环境光
float3 N = normalize(UnityObjectToWorldNormal(ab.normal)).xyz;
float3 L = normalize(WorldSpaceLightDir(ab.vertex)).xyz;
float DotNL = saturate(dot(N,L));
pms.Col = pms.Col + _LightColor0*DotNL; //环境光 + 漫反射
//求半角向量
float3 BJ = normalize(L + normalize(WorldSpaceViewDir(ab.vertex)));
float DotLBJ = saturate(dot(BJ,N));
pms.Col = pms.Col*0.8 + pow(_SpcularColor*DotLBJ*0.6,4); //环境光 + 漫反射 + 镜面反射高光
return pms;
}
float4 frag(parmas INPUT):COLOR
{
return INPUT.Col;
}
ENDCG
}
}
}