unityshader学习笔记2
UnityShader基础结构:
Shader "Custom/MyShader" //shader的名字以及路径
{
Properties
{
//属性
}
SubShader
{
//显卡A使用的子着色器
}
SubShader
{
//显卡B使用的子着色器
}
Fallback "Diffuse"
}
*属性:
Name ("display name", PropertyType) = DefaultValue
属性名 ("显示名称", 类型) = 默认值
//Number and Sliders
_Int ("Int", Int) = 2
_Float ("Float", Float) = 1.5
_Range ("Range", Range(0.0, 5.0)) = 3.0
//Colors and Vectors
_Color ("Color", Color) = (1,1,1,1)
_Vector ("Vector", Vector) = (2,3,4,5)
//Textures
_2D ("2D", 2D) = "" {}
_Cube ("Cube", Cube) = "white" {}
_3D("3D", 3D) = "black" {}
*SubShader
每个UnityShader文件至少包含一个SubShader语义块,当Unity需要加载UnityShader时,会扫描所有的SubShader语义块,然后选择第一个能给在目标平台上运行的SubShader.如果都不支持,Unity就会使用Fallback语义指定的UnityShader.
SubShader通用定义:
SubShader
{
//标签(可选)
[Tags]
//状态(可选)
[RenderSetup]
//Pass定义了一次完整的渲染流程
Pass { }
//Other Passes
//如果Pass过多,会造成渲染性能下降
}
状态设置:ShaderLab提供了一系列渲染状态的设置指令
设置渲染状态时,将会应用到所有Pass,也可以在Pass语义块中单独进行设置
标签(Tags),是一个键值对,键和值都是字符串,用于告诉Unity的渲染引擎,怎样以及何时渲染这个对象,结构如下:
Tags { “Tag1” = “Value1” “Tag2” = “Value2” }
Pass语义块
Pass
{
[Name]
[Tags]
[RenderSetup]
//other code
}
可以在Pass中定义该Pass的名称,如:
Name ”MyPass”
可以使用ShaderLab的UsePass命令来直接使用其他UnityShader中的Pass,如:
UsePass “MyShader/MYPASS”
注意:Unity内部会把所有Pass名称转换成大写字符,因此在使用时必须用大写形式的名字.
Pass同样可以设置标签:
UintyShader还支持一些特殊的Pass:
UsePass:可以使用该命令来复用其他UnityShader中的Pass.
GrabPass:负责抓取屏幕并将结果存储在一张纹理中,以用于后续的Pass处理.
留一条后路: Fallback