US2S3L11——ShaderLab属性类型和CG变量类型的匹配关系

回顾:ShaderLab属性相关

关于ShaderLab属性,详见US2S2L4——Shader的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Properties { }    //属性在该语句块内声明
_属性名("在Inspector窗口上显示的属性名", 类型) = 默认值 //属性的声明方法,要注意属性名默认前缀为'_'
//数值类型,以一个数值作为默认值,数值不需要加f
Int //整形,虽然提供了整数,但是编译时最终都会转换为浮点型
Float //浮点型,在ShaderLab里,浮点数字面量不需要加f
Range(,) //范围浮点型,需要在括号内()填写最小值和最大值
//颜色与向量类型,以(num1,num2,num3,num4)作为默认值,其中的数值不需要加f
Color //颜色,颜色值中的RGBA的取值范围是 0~1 (映射0~255)
Vector //向量,向量值中的XYZW的取值范围没有限制
//纹理类型,以 ""{} 或 "white"{} 或 "black"{} 或 "gray"{} 或 "bump"{} 或 "red"{} 作为默认值,{}是固定写法
2D //2D贴图类型,最常用的纹理,漫反射贴图、法线贴图都属于2D纹理
Cube //立方体纹理,由前后左右上下6张有联系的2D贴图拼成的立方体,比如天空盒和反射探针
//不重要的纹理类型
2DArray //纹理数组,允许在纹理中存储多层图像数据,每层看做一个2D图像,一般使用脚本创建,较少使用,了解即可
3D //一般使用脚本创建,极少使用,了解即可

ShaderLab属性类型和CG变量类型的匹配关系

ShaderLab中声明的属性都是需要在Shader(着色器)逻辑中使用的
我们需要在CG中声明和属性对应类型的同名变量
这样就可以在之后的Shader(着色器)逻辑中去利用它实现对应的逻辑了

我们需要掌握的就是ShaderLab属性类型和CG变量类型的对应关系

CG中变量类型的对应ShaderLab的属性类型

ShaderLab属性类型 CG变量类型
Color​,Vector float4​,half4​,fixed4
Range​,Float​,Int float​,half​,fixed
2D sampler2D
Cube samplerCube
3D sampler3D
2DArray sampler2DArray

如何在CG语句块中使用ShaderLab中声明的属性

直接在CG语句块中声明和属性中对应类型的同名变量即可

假设我们要使用ShaderLab中声明的颜色属性来调整材质显示的颜色:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Shader "TeachShader/Lesson23"
{
Properties
{
_MyColor("MyColor", Color) = (0, 0, 0, 0)

_MyInt("MyInt", Int) = 1
_MyFloat("MyFloat", Float) = 1
_MyRange("MyRange", Range(0, 5)) = 1
_MyVector("MyVector", Vector) = (1, 2, 0, 0)
_My2D("My2D", 2D) = ""{}
_My2DArray("My2DArray", 2DArray) = ""{}
_MyCube("MyCube", Cube) = ""{}
_My3D("My3D", 3D) = ""{}
}

SubShader
{
Pass
{
CGPROGRAM
#pragma vertex myVert
#pragma fragment myFrag

fixed4 _MyColor;

float _MyInt;
float _MyFloat;
fixed _MyRange;
float4 _MyVector;
sampler2D _My2D;
samplerCUBE _MyCube;

//从应用阶段获取对应语义数据后,传递给顶点着色器的回调函数的结构体
struct a2v { ... };

//从顶点着色器传递给片元着色器的结构体数据,同样这里的成员也需要用语义去进行修饰
struct v2f { ... };

v2f myVert(a2v data)
{
v2f v2fData; //需要传递给片元着色器的数据
//...
return v2fData;
}

fixed4 myFrag(v2f data) : SV_Target
{
return _MyColor; //直接使用声明的颜色属性
}
ENDCG
}
}
}

显示效果:

image