Unity Shader的基础
3.3 Unity Shader结构
Shader名称
命名: Shader “Custom/MyShader”
Properties
只是为了让这些属性可以出现在材质面板中。
可以通过カスタムシェーダー GUI - Unity マニュアル对材质面板GUI进行自定义
SubShader
需要包含1个或以上的Subshader语义块。
Pass 的数目过多会造成渲染性能下降。
状态和标签可在SubShader和Pass里同时设置,SubShader中设置的将会作用于所有的Pass
- 状态设置
- SubShader标签
键值对(Key/Value Pair)。 建和值都是字符串类型。
结构:
Tags { “TagName1” = “Value1” “TagName2” = “Value2” }
以下标签仅可在SubShader中声明
- Pass 语义块
Pass {
[Name]
[Tags]
[RenderSeteup]
// Other code
}
-
Fallback
所有的SubShader都不被支持的时候的最终选择。个人感觉类似于Try/Catch里的Finally
Fallback "name"
// Or
Fallback Off
3.4 Unity Shader的形式
Unity可以使用3种形式编写Unity Shader
1. Surface Shader
Unity自创。代码量少,渲染代价比较大。
类似于对顶点/片元Shader的更高一层抽象。
处理了很多光照细节
表面着色器定义在SubShader而非Pass中, 不需要关心使用多少个Pass和Pass中如何渲染
2. Vertex/Fragement
Shader需写在Pass内
灵活性很高,可以控制渲染的实现细节
与Surface Shader相同都是由CG/HLSL编写
3. Fix-function
完全使用ShaderLab语法,而非CG/HLSL
5.2之后所有固定函数Shader都会被编译为Vertex/Fragment Shader
如何进行选择
- 尽量使用Surface shader或Vertex/Fragment shader
- 如果和多种光源打交道,表面着色器会更方便,但需注意移动端性能
- 光照数目非常少,或者有很多自定义的渲染效果,选择顶点/片元着色器
3.6 答疑
- Unity Shader != 真正的Shader。 Unity Shader提供了一种让开发者同时控制渲染流水线中多个阶段的一种方式。一般情况下,不需要关注渲染引擎底层的实现细节。
- Unity中CG和HLSL是等价的。
- 也可以使用GLSL来写,但是平台会受到限制(个人体会,真的不好用)