书中的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 }
逐顶点光照

相关文章:

  • 2022-12-23
  • 2021-09-30
  • 2021-08-29
  • 2021-08-11
  • 2022-12-23
  • 2021-04-02
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-10-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-07
相关资源
相似解决方案