每个Unity Shader文件可以包含多个SubShader语义块,但至少要有一个。当Unity需要加载这个Unity Shader时,Unity会扫描所有的SubShader语义块,然后选择一个能够在目标平台上运行的SubShader。如果都不支持的话,Unity就会使用FallBack语义指定的Unity Shader。
Unity提供这种语义的原因在于,不同的显卡具有不同的能力。SubShader语义块中包含的定义一般如下:
SubShader中定义了一系列Pass以及可选的状态([Render Setup])、标签([Tags])设置。
- 每一个Pass定义了一次完整的渲染流程,但如果Pass的数目过多,往往会造成渲染性能的下降,所以Pass数量要尽可能的小;
- Pass中也可以设置状态和标签:Pass中的状态Render Setup语法与SubShader中的相同,但是标签Tags的语法与SubShader中的就不一样了。
- 如果我们在SubShader中进行了状态、标签的设置,那么这些设置将会用于所有的Pass。