US2S2L7-3——固定函数着色器

固定函数着色器

表面着色器 和 顶点/片元着色器 这两种Unity Shader形式都使用了可编程管线
而对于一些老设备(DX7.0、OpenGL1.5或OpenGL ES 1.1),它们不支持可编程管线着色器
这时就需要使用固定函数着色器来进行渲染,这些着色器只能实现一些非常简单的效果

它的特点是:

  1. 需要在 Pass​ 渲染通道中编写着色器逻辑
  2. 需要使用ShaderLab语法中的渲染设置命令来编写,而非CG和HLSL着色器语言

但是由于这些旧设备目前市面上几乎已经没有了,
所以固定函数着色器我们几乎不会再使用,只做了解即可
即使我们现在在Unity中使用固定函数着色器来编写Shader,在内部也会被编译为顶点/片元着色器
因此真正意义的固定函数着色器已经不存在了

例如下面这种Shader:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Shader "Test/Lesson12"
{
Properties
{
_Color("Main Color", Color) = (1, 1, 1, 1)
}

SubShader
{
Pass
{
Material
{
Diffuse[_Color]
}
Lighting On
}
}
}

固定函数常用命令及示例代码

常用命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Pass
{
//光照,开启灯光影响或关闭灯光影响
Lighting on //开启光照
Lighting off //关闭光照

//渲染固定的颜色,使用Color命令,必须关闭灯光的影响
Color(1,1,1,1) //渲染颜色,利用属性参数设置颜色
Color[颜色变量] //渲染颜色,利用属性参数设置颜色

//Material命令,灯光影响的命令都放在该结构中
Material
{
Diffuse[颜色变量] //设置漫反射光照颜色,代表收到光照的漫反射影响(使用该命令必须开启灯光影响)
}

//设置显示图片纹理的命令
SetTexture[材质变量]
{
Combine texture //显示纹理的原始颜色
Combine texture * primary DOUBLE // 将之前灯光计算出来的颜色 与 texture相乘才能受到灯光影响
}
}

示例代码一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Shader "Lesson/LessonFS_1"
{
Properties
{
_Color("颜色", Color)=(1,1,1,1)
}
SubShader
{
Pass
{
//关闭光照
Lighting off
//渲染颜色
//Color(1,1,0,1)
//利用属性参数设置颜色
Color[_Color]
}
}
FallBack "Diffuse"
}

示例代码二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Shader "Lesson/LessonFS_2" {
Properties
{
_Color("漫反射颜色", Color)=(1,1,1,1)
}
SubShader
{
Pass
{
//开启光照
Lighting on
//使用Material命令
Material
{
//设置漫反射光照颜色
Diffuse[_Color]
}
}
}
FallBack "Diffuse"
}

示例代码三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Shader "Lesson/LessonFS_3" {
Properties
{
_MainTex("纹理", 2D) = "white"{}
}
SubShader
{
Pass
{
//将纹理应用到物体上
SetTexture[_MainTex]
{
//显示纹理的原始颜色
Combine texture
}
}
}
FallBack "Diffuse"
}

示例代码四:

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
Shader "Lesson/LessonFS_4" {
Properties
{
_DiffuseColor("漫反射颜色", Color)=(1,1,1,1)
_MainTex("纹理", 2D) = "white"{}
}
SubShader
{
Pass
{
//开启灯光
Lighting on
//使用Material命令
Material
{
//设置漫反射光照颜色
Diffuse[_DiffuseColor]
}
//受到纹理的影响
SetTexture[_MainTex]
{
// 将之前灯光计算出来的颜色 与 texture相乘才能受到灯光影响
Combine texture * primary DOUBLE
}
}
}
FallBack "Diffuse"
}