US3S1L3-1——半兰伯特光照模型的逐顶点光照
利用半兰伯特光照模型实现光照效果(逐顶点光照)
半兰伯特光照模型的逐顶点实现,和兰伯特一模一样,唯一的区别就是公式:
Color漫反射光照=Color光源×Color材质的漫反射×((标准化后物体表面法线向量⋅标准化后光源方向向量)×0.5+0.5)
具体Shader实现:
要注意,尽管半兰伯特光照模型改进了背光面的显示效果,我们为了光照效果更加自然还是会使用 UNITY_LIGHTMODEL_AMBIENT
不使用 UNITY_LIGHTMODEL_AMBIENT
(左)和使用 UNITY_LIGHTMODEL_AMBIENT
(右)的显示区别对比如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| Shader "TeachShader/Lesson32" { Properties { _MainColor("MainColor", Color) = (1, 1, 1, 1) } SubShader { Tags { "LightMode" = "ForwardBase" }
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
#include "UnityCG.cginc" #include "Lighting.cginc"
fixed4 _MainColor;
struct v2f { float4 pos : SV_POSITION; fixed3 color : COLOR; };
v2f vert (appdata_base v) { v2f v2fData; v2fData.pos = UnityObjectToClipPos(v.vertex); float3 normal = UnityObjectToWorldNormal(v.normal); float3 lightDir = normalize(_WorldSpaceLightPos0.xyz); fixed3 color = _LightColor0.rgb * _MainColor.rgb * ((dot(normal, lightDir)) * 0.5 + 0.5); v2fData.color = UNITY_LIGHTMODEL_AMBIENT + color;
return v2fData; }
fixed4 frag (v2f i) : SV_Target { return fixed4(i.color.rgb, 1); } ENDCG } } }
|
左图为使用半兰伯特光照模型Shader的材质显示效果,右图为使用兰伯特光照模型Shader的材质显示效果:
可见,使用半兰伯特光照模型的材质会更亮一些,阴影处的材质也可以看的更清楚