《Unity Shader》6.4.3 半兰伯特模型
(1)仍然使用6.4.1小节中使用的场景。
(2)新建一个材质。在本书资源中,该材质名为HalfLambertMat。

(3)新建一个Unity Shader。在本书资源中,该Shader名为Chapter6-HalfLambert。把新的Shader赋给第2步中创建的材质。



(4)把第2步中创建的材质赋给胶囊体。

打开Chapter6-HalfLambert,删除已有的Shader代码,把6.4.2小节的Chapter6-DiffusePixelLevel代码粘贴进去,并使用半兰伯特公式修改片元着色器中计算漫反射光照的部分:
Shader "Custom/Chapter6-HalfLambert"
{Properties{_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)}SubShader{Tags {"LightMode"="ForwardBase"}Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;};v2f vert(a2v v) {v2f o;// Transform the vertex from object space to projection spaceo.pos = UnityObjectToClipPos(v.vertex);// Transform the normal from object space to world spaceo.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject); //用的左乘,使用顶点变换矩阵的逆转置矩阵对法线进行相同的变换 //normalize 向量单位化,使其长度为1return o;}fixed4 frag(v2f i) : SV_Target {// Get ambient termfixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;// Get the normal in world spacefixed3 worldNormal = normalize(i.worldNormal);// Get the light direction in world spacefixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);// Compute diffuse termfixed halfLambert = dot(worldNormal, worldLightDir) * 0.5 + 0.5;fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert;fixed3 color = ambient + diffuse;return fixed4(color, 1.0);}ENDCG}}Fallback "Diffuse"
}



