Shader 入门精要笔记(4)
在Unity中Shader需配合材质使用(Material)一个常见的流程是:1.创建一个材质;2.创建一个Unity Shader,并把它赋值给创建的材质3.把材质赋给要渲染的对象4.在材质面板中调整Unity Shader的属性,得到最终满意的效果.
Shader lab :Unity专门为Shader 服务的语言,它使用了一些嵌套在花括号内部语义来描述Unity Shader文件的结构。包括许多渲染所需的数据,例如 Properties 语义定义着色器所需的各种属性,属性会暴露在Shader面板中。一个Unity Shader的基础结构为:
Shader "ShaderName"{
Properties{
//属性
}
SubShader{
//显卡A使用的子着色器
}
SubShader{
//显卡B使用的子着色器
}
Fallback "VertexLit"
Unity在背后会根据使用的平台吧这些结构编译成真正的代码和Shader文件,开发者只需和Unity Shader 打交道即可
Properties语义块包含一系列属性:
Properties{
Name ("display name,PropertyType") = DefaultValu
Name ("display name,PropertyType") = DefaultValu
//更多属性
}
如果我们需要在Shader中访问它们,需使用每个属性的名字(name)。属性的名字通常由下划线开始,显示的名称则是出现在材质面板上的名字。我们还需为每个属性指定它的类型,和默认值。
Shader "Custom/ShaderLabProperties"
Properties{
//Number and Slides
_Int ("Int",Int) = 2
_Float ("Float",Float) = 1.5
_Range("Range",Range(0.0,5.0)) = 3.0
//Colors and Vectors
_Color("Colro",Color) = (1.0,1.0,1.0,1.0)
_Vertex("Vertex",Vertex)= (2.0,3.0,6.0,1.0)
//Textures
_2D("2D",2D) = ""{}
_Cube ("Cube",Cube) = "white"{}
_3D ("3D",3D) = "Black"{}
}
FallBack "Diffuse"
}
注意:Properties语义块的作用仅是为了让这些属性可以出现在材质面板中。
SubShader :每一个Unity Shader 文件可以包含多个SubShader语义块,但最少1个。当Unity需要加载这个Shadr时会扫描所有SubShader语义块,然后选择一个能够在目标平台上运行的SubShader。如果不支持的话,Unity就会使用FallBack语义指定的Unity Shader。
SubShader语义块包含的定义通常如下:
SubShader{
//可选的
[Tags]
//可选的
[RenderSetup]
Pass{
}
//Other Passes
}
SubShader中定义了一系列Pass以及可选的状态([RenderSetup])和标签([Tags])设置.每个Pass定义了一次完整的渲染流程,但如果Pass的数目过多,往往会造成渲染性能的下降。因此,我们应尽量使用最小数目的Pass状态和标签同样可以在Pass中声明,SubShader中的一些标签设置是特定的。它与Pass中使用的标签是不一样的,如果我们在SubShader中进行了设置,将会用于所有的Pass。Shaderlab中常见的渲染设置为:Cull 设置指令:Cull Back| Front | Off 解释:设置剔除模式:剔除背面/正面/关闭剔除。ZTst 设置指令: ZTest Less Greater | LEqual | GEqual | NotEqual | Always. 解释: 设置深度测试时使用的函数。 ZWrite 设置指令: ZWrite On | Off 解释:开启/关闭深度写入。 Blend 设置指令: Blend SrcFaactor DstFactor 解释:开启并设置混合模式 。当在SubShader块中设置上述渲染状态时,将会应用到所有Pass,如果不想的话,可以在Pass语义块中单独进行上面设置。SubShader的标签是一个 键值对 它的键和值都是字符串类型。标签结构如下:
Tags{"TagNamel" = "Valuel" "TagName2" = "Valuel2"}
Pass 语义块
Pass{
[Name]
[Tags]
[RenderSetup]
// Other code
}
在Pass定义该Pass名称
Name "MyPassName"
通过这个名称,我们可以使用ShaderLab的UsePass命令来直接使用其他Unity Shader 的Pass:
UsePass "MyShader/MYPASSNAME"
这样可以提高代码的复用性。Unity内部会把所有Pass 的名称转换为大写字母的表示,在使用Pass命令时必须使用大写形式的名字。
Fallback "name"
//或者
Fallback Off
这是指如果上面所有Pass都不能在设备上运行,那就使用最低级的命令生成Shader.

浙公网安备 33010602011771号