书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照。
前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器)。
第二种算法是获得顶点的法线(顶点着色器),对法线插值(光栅化过程),根据漫反射公式计算像素颜色(片元着色器)。
注:漫反射公式:(光源颜色 * 材质漫反射颜色)* (表面法线矢量 · 表面到光源的矢量)
书中对上两种算法的实现如下:
1 Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex Level" 2 { 3 Properties 4 { 5 _Diffuse("Diffuse", Color) = (1.0, 1.0, 1.0, 1.0) 6 } 7 SubShader 8 { 9 Pass 10 { 11 Tags { "LightMode"="ForwardBase" } 12 13 CGPROGRAM 14 15 #pragma vertex vert 16 #pragma fragment frag 17 18 #include "Lighting.cginc" 19 20 fixed4 _Diffuse; 21 22 struct a2v 23 { 24 float4 vertex : POSITION; 25 float3 normal : NORMAL; 26 }; 27 28 struct v2f 29 { 30 float4 pos : SV_POSITION; 31 fixed3 color : COLOR; 32 }; 33 34 v2f vert (a2v v) 35 { 36 v2f o; 37 o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 38 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; 39 fixed3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object)); 40 fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); 41 fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight)); 42 o.color = ambient + diffuse; 43 44 return o; 45 } 46 47 fixed4 frag(v2f i) : SV_Target 48 { 49 return fixed4(i.color, 1.0); 50 } 51 52 ENDCG 53 } 54 } 55 56 Fallback "Diffuse" 57 }