shader基本概念
shader是用于描述图形染程序中的着色器程序
Unity shader特指Unity中着色器
Unity shader是对shader的一种封装,是对底层图形渲染技术的封装,通过shaderLab的语言
来让我们更加轻松的编写和管理着色器
shader与material
如果想在unity中体现出shader的渲染效果必须配合使用材质(Material)才能达到目标
使用流程:
- 创建一个材质
- 创建一个unity sahder,把该shader赋给上一步中创建的材质
- 将材质赋予给想要渲染的对象
- 在材质面板中调整unity shader的相关属性,以达到最终效果
unity中的shader必须配合材质才能正常使用
Unity中shader类型
- standard surface shader(标准曲面着色器)
包含标准光照模型的表面着色器模板 - Unlit shader
不包含光照的基本顶点/片元着色器 - Image Effect Shader
用于实现屏幕后处理效果的基本模板 - Compute Shader
利用GPU并行计算一些和常规渲染流水线无关的内容 - Ray Tracing Shader
用于实现光线追踪效果的着色器
学习重点主要是顶点/片元着色器
ShaderLab基本结构
ShaderLab主要由4个部分组成
- shader的名字
- shader的属性
- 1~n个子着色器
- 备用的shader
shader "{层级/层级/}着色器名字" // 这里的层级是材质选择着色器那个选项显示的
{
Properties
{
// 材质面板上能看到的属性
}
SubShader
{
//顶点-片段着色器 或 表面着色器 或 固定函数着色器
}
Subshader
{
//更加精简的版本
//目的是适配旧设备
}
// 可以有n个subshader代码块
Fallback "备用的shader" // 设备不支持上述所有子着色器时才用这个
}
属性
在shader编写时我们经常会用到不同类型的变量或贴图等资源
为了增加shader的可调节性,有些变量不会直接在shader程序中写死而是作为开放的属性显示在我们的材质面板上,供我们使用时调节而这些开放的属性就是通过属性来定义的
Shader的属性具有两个特点
1.可以在材质面板被编辑
2.可以在后续当作输入变量提供给所有子着色器使用
Unity shader的属性主要分成三大类:数值、颜色和向量、纹理贴图
语法结构:
_{自定义英文名}("自定义英文名(Display Name)",type)= defaultValue[{options}]
属性名字:规则是需要在前面加一个下划线,方便在之后获取
Display Name:材质面板上显示的名字
type:属性的类型
defaultvalue:将shader指定给材质的时候初始化的默认值
数值类型
//数值类型有三种:
//1.整形
// _MyInt("Display Name",Int) = number
//2.浮点型
// _MyFloat("Display Name",Float)= number
//3.范围浮点型
// _MyRange("Display Name",Range(min,max))= number
注意:Unity shader中的数值类型属性基本都是浮点型数据
虽然提供了整型,但是编译时最终都会转换为浮点型
因此我们更多的使用的还是Float类型
颜色和向量类型
//颜色是由RGBA四个分量代表
//向量是由xyzw四个分量代表
//都可以由一个四个数组成的类型表示
//1.颜色
// _Name("Display Name",Color)=(number1,number2,number3,number4)
//注意:颜色值中的RGBA的取值范围是 0~1(映射0~255)
//2.向量
//_Name("Display Name",Vector)=(number1,number2,number3,number4)
//注意:向量值中的xYzw的取值范围没有限制
纹理贴图类型
//纹理贴图类型有四种
//1.2D 纹理(最常用的纹理,漫反射贴图、法线贴图都属于2D纹理)
// _Name("Display Name",2D)= "defaulttexture"{}
//2.2DArray 纹理(纹理数组,允许在纹理中存储多层图像数据,每层看做一个2D图像,一般使用脚本创建,较少使用,了解即可)
// _Name("Display Name",2DArray)= "defaulttexture"{}
//3.cube map texture纹理(立方体纹理,由前后左右上下6张有联系的2D贴图拼成的立方体,比如天空盒和反射探针)
// _Name("Display Name",cube)= "defaulttexture"{}
//4.3D纹理(一般使用脚本创建,极少使用,了解即可)
// _Name("Display Name",3D)= "defaulttexture"{}
注意:
1.关于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)2.关于默认值后面的 {},固定写法(老版本中括号内可以控制固定函数纹理坐标的生成,但是新版本中没有该功能了)