Shader 的编写形式
一、什么是 shader 的形式
着色器代码既可以放在 SubShder 子着色器语句块中,也可以放在 Pass 渲染通道中,不同的 Shader 形式放置着色器代码的位置也不同 所有,我们一般会使用以下三种形式来编写 Shader
- 表面着色器(可控性低)
- 顶点/片元着色器(重点学习)
- 固定函数着色器(已经弃用)
二、表面着色器
1. 定义
Unity 自己创造的着色器代码类型,本质上是对顶点/片元着色器的封装
2. 优缺点
- 优点:代码量少,Unity 帮助我们处理了很多光照细节,无需自己计算实现光照细节
- 缺点: 消耗大,可控性低
3. 特点:
- 直接在 SubShader 中书写语句块
- 不需要关心和使用多个 Pass,每个 Pass 应该如何渲染,Unity 会在内部帮助我们处理
- 可以使用 CG 和 HLSL 语言书写 Shader 逻辑
- 代码少,可控性低
- 适用于处理需要和各种光源打交道的着色器(主机、pc 平台更为合适,移动平台要考虑性能消耗)
三、 顶点/片元着色器
1. 特点
- 需要在 Pass 中书写着色器代码
- 使用 CG 或者 HLSL 语言书写 Shader 代码
- 代码量多,但是可控性强,能实现更多渲染效果
- 适用于光照处理较少,自定义渲染效果较多时使用(移动平台首选)
四、固定函数着色器
表面着色器 和 顶点/片元着色器 这两种 Unity shader 形式都使用了可编程管线 而对于一些老设备(DX7.8、0penGL1.5 或 openGL ES 1.1),它们不支持可编程管线着色器 这时就需要使用固定函数着色器来进行渲染,这些着色器只能实现一些非常简单的效果 但是由于这些旧设备目前市面上几乎已经没有了所以固定函数着色器我们几乎不会再使用 只做了解即可,即使我们现在在 unity 中使用固定函数着色器来编写 shader,在内部也会被编译为顶点/片元着色器 因此真正意义的固定函数着色器已经不存在了
1. 特点
- 需要在 Pass 渲染通道中编写着色器逻辑
- 需要使用 shaderLab 语法中的渲染设置命令来编写,而非 CG 和 HLSL 着色器语言