Shader的Properties块一般与检视面板打交道
主要分三种类型:
- 属性:
_Name("Display Name", type) = defaultValue[{options}]
_Name("Display Name", type) = defaultValue[{options}]
_Name("Display Name", type) = defaultValue[{options}]
//解析:
_Name:供shader脚本使用的变量名
"Display Name":检视面板看到的名字
type:属性类型
常用类型和默认值:
Color - 以0~1定义的rgba颜色,比如(1,1,1,1);
2D/Cube - 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者"white","black","bump"中的一个
Float - 某个指定的浮点数,如1.0
Range(0,1)-表示在区间0到1中间的浮点数
Vector - 一个4维数,写为 (x,y,z,w)
例:
_MainColor ("Main Color", Color) = (0,0,1,0.5)
_Texture ("Texture", 2D) = "white" {}
_Cub("CubMap",Cube)=""{}
_Rgnge("Range",Range(0,1))=0.5
_Float("Float",Float)=1
_Vector("Vector",Vector)=(0,0,0,0)
每个属性一行,等号后需要跟默认值,行尾不能有结束符号
另外 还有一个{option},它只对2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个,这些都是OpenGL中TexGen的模式,一般不常用
- 控制参数:
[HideInInspector]:在检视面板隐藏该属性。有时候我们shader中的属性需要脚本动态修改不需要美术同学进行调节,添加这个控制参数可以不在材质面板中显示,美术调节的的时候可以直接忽略方便美术同学对材质属性进行调节尤其是材质面板中属性参数较多的时候。
[NoScaleOffset]:检视面板不显示UV的偏移和缩放选项。
[Normal]:表示贴图是法线贴图。
[HDR]:表示贴图是HDR贴图。
[Gamma]:表示float/vector变量在检视面板里为sRGB。
- 开关控制:
ToggleDrawer
EnumDrawer
KeywordEnumDrawer
例子:
Shader "Custom/Material Property Drawer Example"
{
Properties
{
[Header(Material Property Drawer Example)]
[Space(10)]
_FirstColor("First Color", color) = (1,0,0,1)
_SecondColor("Second Color", color) = (0,0,1,1)
[Space(10)]
[Toggle] _OneMinus("OneMinus color", Float) = 0
[Toggle(ENABLE_HALF)] _Half("Half Color", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend Mode", Float) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend Mode", Float) = 1
[Enum(Off, 0, On, 1)] _ZWrite("ZWrite", Float) = 0
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0
[Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull Mode", Float) = 1
[KeywordEnum(None, Add, Multiply)] _Overlay("Overlay ", Float) = 0
}
SubShader
{
Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
ZTest[_ZTest]
Cull[_Cull]
Pass
{
CGPROGRAM
#pragma shader_feature _ONEMINUS_ON
#pragma shader_feature ENABLE_HALF
#pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _FirstColor;
float4 _SecondColor;
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = _FirstColor;
fixed4 col2 = _SecondColor;
// Use #if, #ifdef or #if defined
#if _ONEMINUS_ON
col = 1 - col;
#endif
// Use #if, #ifdef or #if defined
#if ENABLE_HALF
col *= 0.5;
#endif
#if _OVERLAY_ADD
col += col2;
#elif _OVERLAY_MULTIPLY
col *= col2;
#endif
return col;
}
ENDCG
}
}
}
需要额外说明的一点,在上述代码中[Enum(UnityEngine.Rendering.BlendMode)]这个生命引用了UnityEngine中的函数,列出了BlendMode中所有的情况如下图
当然,某些情况下,我们并不希望列举出所有的混合模式,而只给少数的几个给美术人员使用。这一也是可以实现的,只需要我们自己来定义枚举的数值和显示就可以了。 通过在需要枚举的类型前面添加如下代码就可以了:
[Enum(One,1,SrcAlpha,5)]
注意:枚举中的值不能随便定义,一定要跟融合的模型一一对应上,具体可以参看BlendMode中的定义:
Zero = 0,
One = 1,
DstColor = 2,
SrcColor = 3,
OneMinusDstColor = 4,
SrcAlpha = 5,
OneMinusSrcColor = 6,
DstAlpha = 7,
OneMinusDstAlpha = 8,
SrcAlphaSaturate = 9,
OneMinusSrcAlpha = 10