计算机科学中的任何问题都可以通过增加一层抽象来解决。 ——大卫·惠勒
4种标准Unity Shader模板
- Standard Surface Shader:包含标准光照模型的表面着色器模板
- Unlit Shader:不包含光照的基本顶点/片元着色器
- Image Effect Shader:提供一个实现各种屏幕处理效果的基本模板
- Compute Shader:利用GPU的并行性来进行一些与常规渲染流水线无关的计算
Unity Shader基础:ShaderLab
1.Properties
Properties{
Name ("display name",PropertyType) = DefaultValue
//更多属性
}
Name——Shader内访问的名字
display name ——材质面板显示的名字
PropertyType——类型
2.SubShader
SubShader{
[Tags]
[RenderSetup]
Pass{
}
}
Tags —— 标签:是一个键值对
RenderSetup —— 状态:可设置显卡的各种渲染状态
3.Pass
Pass{
[Name]
[Tags]
[RenderSetup]
}
Name —— 定义Pass名称,还可使用“UsePass”直接使用Unity Shader中的Pass
4.Fallback
Fallback "name"
Fallback off
如果Shader中定义的所有SubShader都不能在该显卡中运行,就使用该Shader。
Unity Shader 的形式
- 表面着色器(Surface Shader)
是Unity自己创造的一种着色器,渲染代价较高,但Unity为我们处理了很多光照细节,使用方便。
表面着色器直接定义在SubShader中,不需要定义在Pass内。 - 顶点/片元着色器(Vertex/Fragment Shader)
编写更加复杂,但是更加灵活。定义在Pass语义块中
Unity Shader的选择
- 除非有明确需求必须使用固定函数着色器,否则尽量不使用。
- 如果想跟各种光源打交道,用表面着色器,需要考虑它在移动平台的性能表现。
- 如果你需要使用的光照数目非常少,那么顶点/片元着色器会是更好的选择
- 如果有很多自定义的渲染需求,使用顶点/片元着色器
《Unity Shader 入门精要》冯乐乐