US2S2L4——Shader的属性
US2S2L4——Shader的属性
回顾:ShaderLab的基本结构
ShaderLab主要由4个部分组成
- Shader的名字
- Shader的属性
- 1~n个子着色器
- 备用的Shader
本章代码关键字
1 | Properties { } //属性在该语句块内声明 |
Shader的属性
在Shader编写时我们经常会用到不同类型的变量或贴图等资源
为了增加Shader的可调节性,有些变量不会直接在Shader程序中写死
而是作为开放的属性显示在我们的材质面板上,供我们使用时调节
而这些开放的属性就是通过属性 Properties
来定义的
Shader的属性具有两个特点:
-
可以在材质面板被编辑
-
可以在后续当作输入变量提供给所有子着色器使用
如何使用,详见:US2S3L11——ShaderLab属性类型和CG变量类型的匹配关系
Shader的属性主要就是三种类型:数值、颜色和向量、纹理贴图
Shader的属性的基本语法
-
在Shader文件中
Shader属性是存在于Shader语句块中的
Properties
属性语句块
我们只需要在Properties
语句块中按照语法规则声明属性即可1
2
3
4
5
6
7
8Shader "TeachShader/Lesson4"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader { ... }
} -
属性的基本语法
1
_Name("Display Name", type) = defaultValue[{options}]
-
_Name
:属性名字,规则是需要在前面加一个下划线,方便在之后获取 -
Display Name
:材质 Inspector 面板上显示的名字,注意,如果此Shader文件非UTF8编码的,则中文属性无法正常显示 -
type
:属性的类型 -
defaultValue
:将Shader指定给材质的时候初始化的默认值
注意,在Shader中,语句结束不需要加
;
-
-
Unity Shader的属性主要分成三大类:数值、颜色和向量、纹理贴图
-
数值类型属性
注意:Unity Shader中的数值类型属性基本都是浮点型(
Float
)数据
虽然提供了整数(Int
),但是编译时最终都会转换为浮点型
因此我们更多的使用的还是Float
类型-
整形
1
_Name("Display Name", Int) = number
示例:
1
2
3
4
5
6Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MyInt("MyInt", Int) = 1
_MyFloat("MyFloat", Float) = 0.5 //不要加f!!!
}在Inspector窗口上显示效果:
-
浮点型
注意,ShaderLab不是C#,我们不需要在默认的浮点数后面添加
f
,否则会报错!1
_Name("Display Name", Float) = number
示例:
1
2
3
4
5
6Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MyInt("MyInt", Int) = 1
_MyFloat("MyFloat", Float) = 0.5 //不要加f!!!
}在Inspector窗口上显示效果:
-
范围浮点型
注意,ShaderLab不是C#,我们不需要在默认的浮点数后面添加
f
,否则会报错!1
_Name("Display Name", Range(min,max)) = number
示例:
1
2
3
4
5
6
7Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MyInt("MyInt", Int) = 1
_MyFloat("MyFloat", Float) = 0.5 //不要加f
_MyRange("MyRange", Range(1, 5)) = 2 //不要加f
}在Inspector窗口上显示效果:
-
-
颜色和向量类型属性
颜色和向量类型属性之所以归纳在一起,是因为:
- 颜色是由RGBA四个分量代表
- 向量是由XYZW四个分量代表
他们都可以由一个四个数组成的类型表示
-
颜色
注意:颜色值中的RGBA的取值范围是 0~1 (映射0~255),同样数字不要加
f
1
_Name("Display Name", Color) = (number1,number2,number3,number4)
示例:
1
2
3
4Properties
{
_MyColor("MyColor", Color) = (0.5, 0.5, 0.5, 0.5) //不要加f!
}在Inspector窗口上显示效果:
-
向量
注意:向量值中的XYZW的取值范围没有限制,同样数字不要加
f
1
_Name("Display Name", Vector) = (number1,number2,number3,number4)
示例:
1
2
3
4Properties
{
_MyVector("MyVector", Vector) = (99, 95, 93, 123) //不要加f!
}在Inspector窗口上显示效果:
-
纹理贴图类型属性
-
2D 纹理
最常用的纹理,漫反射贴图、法线贴图都属于2D纹理
1
_Name("Display Name", 2D) = "defaulttexture"{}
-
关于
"defaulttexture"
默认值取值- 不写:默认贴图为空
-
"white"
:默认白色贴图(RGBA:1,1,1,1) -
"black"
:默认黑色贴图(RGBA:0,0,0,1) -
"gray"
:默认灰色贴图(RGBA:0.5,0.5,0.5,1) -
"bump"
:默认凸贴图(RGBA:0.5,0.5,1,1),一般用于法线贴图默认贴图 -
"red"
:默认红色贴图(RGBA:1,0,0,1)
-
关于默认值后面的
{}
它是固定写法,(老版本中括号内可以控制固定函数纹理坐标的生成,但是新版本中没有该功能了)
示例:
1
2
3
4Properties
{
_My2D("My2D", 2D) = "White"{}
}在Inspector窗口上显示效果:
-
-
2DArray 纹理
纹理数组,允许在纹理中存储多层图像数据,每层看做一个2D图像,一般使用脚本创建,较少使用,了解即可
1
_Name("Display Name", 2DArray) = "defaulttexture"{}
示例:
1
2
3
4Properties
{
_My2DArray("My2DArray", 2DArray) = ""{}
} -
Cube map texture纹理
立方体纹理,由前后左右上下6张有联系的2D贴图拼成的立方体,比如天空盒和反射探针
1
_Name("Display Name", Cube) = "defaulttexture"{}
-
关于
"defaulttexture"
默认值取值- 不写:默认贴图为空
-
white
:默认白色贴图(RGBA:1,1,1,1) -
black
:默认黑色贴图(RGBA:0,0,0,1) -
gray
:默认灰色贴图(RGBA:0.5,0.5,0.5,1) -
bump
:默认凸贴图(RGBA:0.5,0.5,1,1),一般用于法线贴图默认贴图 -
red
:默认红色贴图(RGBA:1,0,0,1)
-
关于默认值后面的
{}
它是固定写法,(老版本中括号内可以控制固定函数纹理坐标的生成,但是新版本中没有该功能了)
示例:
1
2
3
4Properties
{
_MyCube("MyCube", Cube) = ""{}
}在Inspector窗口上显示效果:
Cube属性关联的贴图类型是CubeMap,可以右键 —— Create —— Legacy —— Cubemap创建
-
-
3D纹理
一般使用脚本创建,极少使用,了解即可
1
_Name("Display Name", 3D) = "defaulttexture"{}
示例:
1
2
3
4Properties
{
_My3D("My3D", 3D) = ""{}
}
-
-