一、概要:
使用Half Lambert lighting model(半兰伯特光照模型)和使用一个ramp texture来控制diffuse shading
这个技术在Team Fortress 2(军团要塞2)中流行起来过
二、具体代码
Shader "Custom/LambertLight" {
Properties {
_RampTex ("渐变纹理贴图:)", 2D) = "white" {}
_EmissiveColor("自发光颜色:",Color) = (1,1,1,1)
_AmbinetColor("环境光颜色:",Color) = (1,1,1,1)
_ChangeValue("改变(次方)值",Range(0,10)) = 2.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf HalfLambert
sampler2D _RampTex;
float4 _EmissiveColor;
float4 _AmbinetColor;
float _ChangeValue;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
float4 c = pow((_EmissiveColor + _AmbinetColor),_ChangeValue);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
//自定义的光照模型函数(用的是正向渲染)
inline float4 LightingHalfLambert(SurfaceOutput s,fixed3 lightDir,fixed atten){
float diffLight = max(0,dot(s.Normal,lightDir));
float halfLambert = diffLight * 0.5 + 0.5;//半兰伯特的公式
//渐变取值,第二个参数是需要采样的UV坐标,这里,我们并不想使用一个vertex来代表一个UV坐标
//进行采样,而仅仅想使用一个漫反射浮点值(halfLambert)来映射到渐变图上的某一个颜色值
float3 ramp = tex2D(_RampTex, (float2)halfLambert).rgb;
float4 col;
col.rgb = s.Albedo * _LightColor0.rgb * (ramp);
col.a = s.Alpha;
return col;
}
ENDCG
}
FallBack "Diffuse"
}
要点:
float halfLambert = diffLight * 0.5 + 0.5;//半兰伯特的公式
float3 ramp = tex2D(_RampTex, (float2)halfLambert).rgb;
渐变取值,第二个参数是需要采样的UV坐标,这里,我们并不想使用一个vertex来代表一个UV坐标进行采样,而仅仅想使用一个漫反射浮点值(halfLambert)来映射到渐变图上的某一个颜色值
使用的
渐变纹理贴图如下:
三、效果