一、ShaderLab总大纲
ShaderLab意义
3、控制渲染引擎的工作方式
这个功能是最主要功能,他可以控制渲染引擎的工作方式,也可以和引擎的其他功能产生沟通,比如我可以使用脚本代码控制其数据,或者通过编辑器控制着色器代码的数据;
4、解析显卡编程代码
对于 OpenGL 3D API他自动调用 GLSL解析程序;
对于DirectX 3D API他自动调用HLSL解析程序;
如果发现你写的是Cg代码,他使用Cg version 3.0来实现代码解析;
语法框架结构
框架层级
1、外框:用来标注他是什么代码
Shader " 着色器代码名称 "
{
}
注意:着色器代码名称可以实现层级方式,例如:"MyShader/FixedShader",表示这个着色器代码数据 "MyShader"这个总目录之下的一个子对象;
2、属性框:用来和外界程序沟通的通道
Properties
{
// 属性:公共级别变量;
}
注意:属性框必需存在于Shader "着色器名称" { } 这样外框之内。而且一定要在外框的最上面;
属性:
写法:变量名 ("在检视体面板上提供的名称 ", 变量的类型)=初始化值
写法注意:属性必须初始化,变量名必须是英文的,"在检视体面板上提供的名称 ":这个东西可以是中文,一定要记住,最后不能添加 ";"进行结尾。这个属性变量一行只能定义一个,绝对不容许出现多个变量定义;
属性变量类型:
Vector : 向量类型,对应一个四位的向量: (x, y, z, w);
Color : 颜色类型(float),对应一个 RGBA颜色设定: (R, G,B,A)
Float : 单精度浮点,没有范围,对于初始化值据对不容许加入 "f"强转符号,例如 1.0
Range(min, max): 区间取值,范围是你定义的min到 max之间的数包含min和 max的数。这个数必须是单精度浮点;
2D: 表示一个2D的纹理贴图对象,必须是外界传递的 Texture2D资源。
Cube : 立方体贴图,多用于天空盒,支持六面体贴图;
Rect : 矩形贴图,用户鱼眼相机;
属性定义例如:
Properties
{
// 表示我们定义了一个颜色变量,并且初始化为白色
_Color("颜色", Color) = (1,1,1,1)
// 表示我们定义了一个坐标,初始化为 Zero
_Position("坐标", Vector) =(0,0,0,0)
// 表示我们定义了一个浮点化的数值
_Value("浮点数值", Float)=1.0
// 表示我们定义了一个区间值,并且给了一个值
_Range ( "区间值", Range(0.0, 1.0) ) = 0.5
// 表示我们定义了一个白色的底图,但是没有数据存在,需要外界程序给我们指定一个 2D纹理贴图;
_MainTex("纹理贴图", 2D) = "white"{}
}
3、子外框:用来给着色框架提供着色代码
SubShader
{
}
注意: SubShader这个子外框主要是用来提供着色代码的, SubShader可以实现好几个,多个 SubShader是为了让渲染引擎根据当时的渲染条件来选择可以执行的渲染代码。这个选择过程主要是渲染引擎自己抉择的,当渲染引擎选择了一个可以执行的 SubShader代码,其他的代码就全部失效;
SubShader 的执行代码分类:
1、Unity引擎自带的一种功能渲染模式:表面体着色,他只能实现上色的功能,不能控制网格对象中的顶点坐标。对于的他上色一定是具有实时光照效果的;
2、固定着色器代码,他是通过一系列的命令,控制渲染引擎工作;
3、着色器代码:GLSL, HLSL, Cg这些就是显卡元语言代码,他可以干预网格定义定位和颜色的上色过程;