光线照射到粗糙物体表面,向各个方向等强度地反射光,因此从各个视角出发,物体表面呈现相同的亮度,所看到的物体表面某点的明暗程度不随观测者的位置变化的,这种等同地向各个方向散射的现象称为光的漫反射。
Lambert光照模型
漫反射光的强度近似地服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。
Lambert漫反射模型:
简介
Lambert 光照模型,是光源照射到物体时产生的漫反射效果,没有高光。如下图:这个时顶点函数处理后的该光照模型,因此看起来像素不够平滑。
漫反射强度=法线与光线的点积即(N*L),当他们夹角为0时,漫反射强度最大,夹角为90度时,反射强度为0。
float3 diffuseReflection = atten * _LightColor0.xyz * max(0.0, dot(normalDirection,lightDirection));//反射系数*灯光颜色*漫反射强度; float3 lightFinal = diffuseReflection + UNITY_LIGHTMODEL_AMBIENT.xyz;//漫反射后与环境光叠加
float4 o.col = float4(lightFinal*_Color.rgb,1.0);//最终的漫反射效果在与模型的材质叠加(颜色,贴图等) 源代码:
1 Shader "JQM/Lambert" 2 { 3 Properties 4 { 5 _Color("Color", color) = (1.0,1.0,1.0,1.0) 6 } 7 SubShader{ 8 Pass{ 9 10 Tags { "LightMode" = "ForwardBase"} 11 12 CGPROGRAM 13 #pragma vertex vert 14 #pragma fragment frag 15 16 //使用自定义变量 17 uniform float4 _Color; 18 19 //使用Unity定义的变量 20 uniform float4 _LightColor0; 21 22 struct vertexInput{ 23 float4 vertex:POSITION; 24 float3 normal:NORMAL; 25 }; 26 27 struct vertexOutput{ 28 float4 pos:SV_POSITION; 29 float4 col:COLOR; 30 }; 31 32 //顶点程序 33 vertexOutput vert(vertexInput v) 34 { 35 vertexOutput o; 36 37 float3 normalDirection = normalize( mul(float4(v.normal,0.0),_World2Object)).xyz; 38 float3 lightDirection; 39 float atten = 1.0; 40 41 lightDirection = normalize(_WorldSpaceLightPos0.xyz); 42 43 float3 diffuseReflection = atten * _LightColor0.xyz * max(0.0, dot(normalDirection,lightDirection)); 44 float3 lightFinal = diffuseReflection + UNITY_LIGHTMODEL_AMBIENT.xyz; 45 46 o.col = float4(lightFinal*_Color.rgb,1.0); 47 o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 48 return o; 49 } 50 51 //片段程序 52 float4 frag(vertexOutput i):COLOR 53 { 54 return i.col; 55 } 56 57 ENDCG 58 } 59 } 60 61 }
物体在空间中 受到 光源 环境光 和 自身材质(颜色,贴图) 的综合因素的影响,形成的效果。
时间: 2024-10-22 06:34:35