第三章 Unity Shader基础
一对好兄弟:材质和Unity Shader
在Unity中需要配合材质和 Unity Shader 才能达到需要的效果。Unity Shader定义了渲染所需的各种代码(如顶点着色器和片元着色器)、属性和指令,而材质则允许我们调节这些属性,并将其最终赋给相应的模型。为什么会有材质呢?对于美术人员来说,材质是他们十分熟悉的一种事物。Unity的材质和许多建模软件如(Cinema 4D、 Maya等)中提供的材质功能类似,它们都提供了一个面板来调整材质的各个参数。
Unity 中的 Shader
Unity 中的 Shader 文件,统称为Unity shader,是Unity在传统shader上实现的一层抽象,帮开发者屏蔽了很多细节。点击项目窗口中的 Unity shader 文件,能看到导入设置面板,该面板上能看到一些信息:
- Show generated code按钮,可以让我们查看生成的顶点/片元着色器。
- Compile and show code 可以展示该Unity shader针对不同的图像编程接口(例如OpenGl、D3D9、D3D11等)最终编译成的Shader代码。
- 还有一些信息与我们在 Unity Shader 中的标签设置有关。
ShaderLab 语法
ShaderLab 是编写 Unity Shader 的说明性语言,类似于 CgFX 和 Direct3D Effects语言。它们都定义了要显示一个材质所需的所有东西,而不仅仅是着色器代码。Unity会在背后,根据使用的平台,编译成真正的代码和Shader文件。
一个 Unity shader 的基础结构大致如下:
Shader "Shader Name"{
Properties{
//属性
Name("displayName", PropertyType) = Defaultvalue
}
SubShader{
//针对显卡A使用的子着色器
[Tags]
[RenderSetup]
Pass{
//设置渲染状态和标签
[name]
[Tags]
[RenderSetup]
//开始 Cg 代码片段
CGPROGRAM
ENDCG
//其他设置
}
//其他需要的Pass
}
SubShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
表面着色器、顶点/片元着色器、固定函数着色器
- 表面着色器(Surface shader)是Unity自己创造的一种着色器代码类型,可以理解为顶点/片元着色器的更高一层抽象。Unity在这里处理了很多光照细节。Unity在背后仍旧把它转化成对应的顶点/片元着色器。定义在SubShader中的CGPROGRAM和ENDCG之间。
- 顶点/片元着色器(Vertex/Fragment Shader),写在Pass中的CGPROGRAM和ENDCG之间。
- 固定函数着色器,是针对不支持可编程管线着色器的设备,已经很少用了。