Unity Shader (2)
1、给shader取名字,为了方便管理可以在名字中插入‘/’分隔符来进行分层与MenuItem一个意思。
Shader "NewMenu/colorMaterialShader" {}
2、属性(Properties) 是材质与shader通信的媒介,这是可选属性
Properties
{
Name ("display name", PropertyType) = DefaultValue
......
}
Name 是代码中使用的,display name是编辑器属性面板显示用的,PropertyType是数据类型
对于Int、Float、Range(min, max) 来说都是数字类型的属性;对于Color、Vector这些复合数字类型的属性,默认值使用一个括号包围起来;2D、Cube、3D这些纹理类型的默认值通常是一个字符串跟着一个花括号,字符串要么是空要么是内置纹理的名字,花括号适用于指定一些纹理属性但在Unity 5.0后这些内容被移除。
3、SubShader是为实现一个效果针对不同环境下提供的实现代码块。当Unity需要加载shader的时候,会从头开始遍历所有的SubShader,选取第一个能够在目标平台(硬件支持)上顺利执行的代码实现,都没有那么就会使用Fallback(这就是个备胎啊)。
SubShader
{
[Tag]
[RenderSetup]
Pass {}
Pass {}
......
}
RenderSetup 是一些渲染管线的状态设置指令,作用于同一个SubShader组的所有Pass块,当要在Pass之间区分是需要各自在Pass内设置这些内容,面剔除、深度测试、混合等等
Tags 是键值对,设置渲染方式,前向渲染、控制渲染顺序等等
4、Pass 是目标渲染效果的具体实现,Pass可以在其它shader中通过UsePass "Shader_Name/Pass_Name" 被调用(Unity内部会把Pass的名字都转换为大写)
Pass {
[Name]
[Tags]
[RenderSetup]
......//imp code
}
RenderSetup 与SubShader中的一样
Tags 设置的也是渲染相关的内容
5、FallBack "Shader_Name" 表示的当其它的效果实现代码无法使用时,这是最后的选择,但也可以不要这个备胎 FallBack Off
6、Unity Shader 并不是大众所说OpenGL、DirectX意义上的Shader,因为Unity Shader的管辖范围包括了众多渲染状态的设置,同时也隐藏了实现上的许多细节,更如对于细分着色器、几何着色器的支持力度不够。
7、GL/HLSL、GLSL能够嵌入到ShaderLab中,需要嵌套在CGPROGRAM、ENDCG与GLSLPROGRAM、ENDGLSL之间
Pass {
Name "PassName"
......// 渲染状态、tags等内容的设置
CGPROGRAM
#pragram vertex vert
#pragram fragment frag
......
ENDCG
......// 其它一些内容的写入
}
8、Unity Shader有一种独有的shader类型,表面着色器(Surface Shader),它的主要功能是隐藏了许多光照实现的细节方便我们使用光照。另外两种是顶点(vertex shader)和片元(fragment shader)着色器。