材质和Unity Shader
常见流程:
(1)创建一个材质
(2)创建一个Unity Shader,并把它赋给上一步创建的材质
(3)把材质赋给要渲染的对象
(4)在材质面板中调整Unity Shader的属性
ShaderLab:Unity提供的编写Unity Shader的一种说明性语言
基础结构
Shader "ShaderName"{
Properties{
//属性
}
SubShader{
//显卡A使用的子着色器
}
SubShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
}
Shader "___/___": 控制材质面板所在位置
Properties:属性
每个Unity Shader文件可以包含多个SubShader语义块,但至少有一个。当Unity需要加载这个Unity Shader时,Unity会扫描所有的SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader。如果都不支持,Unity就会使用Fallback语义指定的Unity Shader。
SubShader语义块中包含的定义通常如下:
SubShader{
//可选的
[Tags]
//可选的
[RenderSetup]
Pass{
}
//Other Passes
}
ShaderLab提供了一系列渲染状态的设置指令,这些指令可以设置显卡的各种状态。
当在SubShader块中设置了上述渲染状态时,将会应用到所有的pass。如果不想这样,可以在pass语义块中单独进行上面的设置。
SubShader:是一个键值对,它的键和值都是字符串类型,是SubShader和渲染引擎之间的沟通桥梁。
标签的结构:
Tags {"TagName1" = "Value1" "TagName2" = "Value2"}
Pass语义块
Pass{
[Name]
[Tags]
[RenderSetup]
//Other code
}
可以在Pass中定义该Pass的名称
Name "MyPassName"
通过这个名称,可以使用ShaderLab的UsePass命令来直接使用其他Unity Shader中的Pass,例如
UsePass “MyShader/MYPASSNAME"
由于Unity内部会把所有Pass的名称转换成大写字母的表示,因此,在使用UsePass命令时必须使用大写形式的名字。
Fallback
可以设置最低级的Unity Shader,Fallback还会影响阴影的投射。在渲染阴影纹理时,Unity会在每个Unity Shader中寻找一个阴影投射的Pass。通常情况下,不需要专门实现一个Pass,这是因为Fallback使用的内置Shader中包含了这样一个通用的Pass。
真正意义上的Shader代码都需要包含在ShaderLab语义中
Shader "MyShader"{
Properties{
//所需的各种属性
}
SubShader{
//表面着色器(Surface Shader)或者
//顶点/片元着色器(Vertex/Fragment Shader)或者
//固定函数着色器(Fixed Function Shader)
}
SubShader{
//和上一个SubShader类似
}
}