Properties语义块包含了一系列属性(property),这些属性将会出现在材质面板中。
Properties属性
属性定义:
Properties{
_Color("ColorInspector",Color) = (1,1,1,1)
}
变量名:_Color
Inspector的面板上显示名称:ColorInspector
类型:Color
默认值:(1,1,1,1)
属性类型
有如下几种
Properties{
_Color("Color",Color) = (1,1,1,1)//颜色
_Vector("Vector",Vector) = (3,2,3,1)//向量
_Int("Int",Int) = 234//int类型
_Float("Float",Float) = 1.2
_Range("Range",Range(2,8)) = 6//范围值
_2D("Texture",2D) = "red"{}//贴图
_Cube("Cube",Cube) = "white"{}//天空盒
_3D("Texure",3D) = "black"{}//3D贴图
}
Color:颜色
颜色属性是个四维分量,也就是由四个数值来组成的,每个数值代表着颜色的一个通道。四个数值依次为RGBA(红,绿,蓝,透明)。
RGB的取值是0-255(2的8次方个值域),在Shader中范围变为0-1,例如(1,1,1,1)显示为白色。
Properties{
_Color("Color",Color) = (1,1,1,1)//颜色
}
Vector:向量
Properties{
_Vector("Vector",Vector) = (3,2,3,1)
}
整型Int
Properties{
_Int("Int",Int) = 234//int类型
}
浮点数Float
Properties{
_Float("Float",Float) = 3.14
}
Range范围
Properties{
_Range("Range",Range(2,8)) = 6//范围值
}
可拖动滑动条滑动
2D纹理
Properties{
_MainTex("Main Tex",2D) = "white"{}//纹理贴图
}
默认值
2D纹理的默认值有以下几种:white、black、gray或者bump
如果不设置默认值,即=“”{},则其实与=“gray”{}相同;法线贴图设置为bump,意思是如果未使用法线贴图,则使用物体默认自带的法线。
Properties{
_MainTex("Main Tex",2D) = "bump"{}//法线贴图
}
Shader内部会自动调用Unity内部准备的一张小图片,white就是纯白色,black就是纯黑色,gray就是灰色图,bump就是法线图。
Cube, 立方体纹理
Properties{
_Cube("Cube",Cube) = "white"{}//天空盒
}
3D, 3D贴图
Properties{
_3D("Texure",3D) = "black"{}//3D贴图
}
Cg/HLSL中的数据类型
讲完上面的属性,不得分享数据类型,因为只有上面定义的属性,我们的代码依然无法使用上面的属性定义,需要下面数据类型、名称一一对应才行
对应的定义如下:
属性定义
Properties{
_Color("Color",Color) = (1,1,1,1)//颜色
_Vector("Vector",Vector) = (3,2,3,1)//向量
_Int("Int",Int) = 5//int类型
_Float("Float",Float) = 1.2
_Range("Range",Range(2,8)) = 6//范围值
_2D("Texture",2D) = "red"{}//贴图
_Cube("Cube",Cube) = "white"{}//天空盒
_3D("Texure",3D) = "black"{}//3D贴图
}
数据类型定义
float4 _Color;
int _Int;
//float _Int;这里用float定义_Int也可以
float _Float;
float _Range;
sampler2D _2D;
samplerCUBE _Cube;
sampler3D _3D;
关于float、half、fixed这里说下
- float:高精度浮点值,通常用32位存储
- half:中等精度浮点值,通常用16位存储,范围-60000~+60000
- fixed:最低精度浮点值,通常用11位存储,范围-2.0~+2.0,通常用于常规的颜色与贴图,以及低精度间的一些运算变量等。
在PC平台上,Shader中写的是half还是fixed,统统都会被当作float来处理。half与fixed仅在一些移动设备上有效。
比较常用的写法是,除了位置和坐标用float以外,其他用half。
fixed精度实际上只在一些较旧的移动平台上有用,在大多数现代的GPU上,它们内部把fixed和half当成同等精度来对待。
完整代码
Shader "My/01 shader"{
Properties{
_Color("Color",Color) = (1,1,1,1)//颜色
_Vector("Vector",Vector) = (3,2,3,1)//向量
_Int("Int",Int) = 234//int类型
_Float("Float",Float) = 1.2
_Range("Range",Range(2,8)) = 6//范围值
_2D("Texture",2D) = "red"{}//贴图
_Cube("Cube",Cube) = "white"{}//天空盒
_3D("Texure",3D) = "black"{}//3D贴图
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 _Color;
int _Int;
//float _Int;这里用float定义_Int也可以
float _Float;
float _Range;
sampler2D _2D;
samplerCUBE _Cube;
sampler3D _3D;
float4 vert(float4 v:POSITION):SV_POSITION{
return UnityObjectToClipPos(v);
}
fixed4 frag():SV_Target{
return fixed4 (_Int,1,1,1);
}
ENDCG
}
}
FallBack "Diffuse"
}