Lambert光照模型:
float LambertDiffuse = max(0.0,dot(normalDirection,lightDirection););
float3 finalColor =SurfaceColor * LambertDiffuse * LightAttenuation * LightColor;
Half-Lambert光照模型:
NdotL范围在[0, 1],因此hLambert的范围在[0.5, 1]。这个算法把范围0~1映射到了范围0.5~1中,整体就提高了最后的数值。
float NdotL = max(0.0,dot(normalDirection,lightDirection));
float hLambert = NdotL * 0.5 + 0.5;
float3 finalColor = SurfaceColor * (hLambert * LightAttenuation * 2)* LightColor;
半兰博公式通用化:
兰博与半兰博曲线及其效果比较:
映射过的兰伯特模型可以makefloat2形成UV,实现渐变纹理效果