简介
- 背景:正常编写和生效shader代码需要比较繁琐的编写步骤
- 方案:Unity Shader提供了一套解决方案能简化上述步骤,方便用户管理自己的shader代码以及渲染设置
- Unity Shader:在Unity中指的是一个ShaderLab文件(.shader文件后缀)
- 导入设置(Import Settings):针对外部文件使用,Unity Shader也有自己的Import Settings,可以配置默认属性(Default Maps配置),例如:默认纹理
ShaderLab
- 简介:ShaderLab是Unity为开发者提供的高层级的渲染抽象层,是Unity提供用于编写Unity Shader的一种声明性语言(SDL)
Unity Shader的结构
-
shader名字:shaderlab中首行来指定Unity Shader名字,方便材质属性面板中查找
- 注意:跟shader文件名是2个不同的概念(但系统默认命名规则是以文件名来控制,但也同时支持用户自定义修改Unity Shader中的名字)
- 注意:跟shader文件名是2个不同的概念(但系统默认命名规则是以文件名来控制,但也同时支持用户自定义修改Unity Shader中的名字)
-
Properties(属性)
- 单个属性声明:一般包含4个关键信息,包括:属性名、面板显示名字、类型、默认值
- 语法:
AttrName {"dislay name", PropertyType} = DefaultValue
- AttrName一般以下划线开头(为啥?)
- 语法:
- 单个属性声明:一般包含4个关键信息,包括:属性名、面板显示名字、类型、默认值
-
SubShader
- 每个Unity Shader中可以包含多个SubShader,但至少也需要保留1个
- 生效逻辑:
- Unity加载Unity Shader
- 扫描所有SubShader语义块,选择首个能够在目标平台上运行的SubShader(跨平台、跨软硬件的可定制化)
- 都不支持则使用Fallback语义指定的Unity Shader(保底机制)
- 结构
- Tags(标签):键值对,可以控制渲染顺序、是否批处理等信息(讲道理为何不和RenderSetup整合呢?)
- RenderSetup(状态):例如Cull(Back|Front|Off)、ZTest(深度测试函数)、ZWrite(开启/关闭深度写入)、Blend(混合)
- Pass:定义了完整的渲染流程,也会包含渲染状态设置,但跟上述的RenderSetup有区别(全局生效、局部生效)
- Name
- Tags
- RenderSetup
-
Fallback:保底机制
- 如果其他SubShader都在显卡上跑不起来,就运行我吧
Unity Shader的形式
表面着色器(Surface Shader)
- 简介:Unity自己创造的一种着色器代码类型,是对Vertext Shader和Fragment Shader的更上一层封装(Unity背后会将Surface Shader转换为Vertext 和 Fragment Shader)
- 结构
- 无需通过Pass管理,一般是通过CGPROGRAM和ENDCG之间编写代码(主要是Unity内部会封装好用户无需关心相关的pass处理,只需要按需填充参数)
- 使用Cg/HLSL语法编写(Unity自己封装),但不一定所有函数都有适配支持;
顶点/片元着色器
- 应用场景:灵活性更高(但同时也更复杂)
- 结构
- 要求写在Pass语义块内(跟Surface Shader有区别)
固定函数着色器(被抛弃的角落)
- 应用场景:针对老旧设备只能支持固定渲染管线,不支持可编程管线,因此需要提供一套兼容方案