Unity学习 - Shader1

shader基本概念 shader是用于描述图形染程序中的着色器程序 Unity shader特指Unity中着色器 Unity shader是对shader的一种封装,是对底层图形渲染技术的封装,通过shaderLab的语言 来让我们更加轻松的编写和管理着色器 shader与material 如果

shader基本概念

shader是用于描述图形染程序中的着色器程序
Unity shader特指Unity中着色器
Unity shader是对shader的一种封装,是对底层图形渲染技术的封装,通过shaderLab的语言
来让我们更加轻松的编写和管理着色器

shader与material

如果想在unity中体现出shader的渲染效果必须配合使用材质(Material)才能达到目标
使用流程:

  1. 创建一个材质
  2. 创建一个unity sahder,把该shader赋给上一步中创建的材质
  3. 将材质赋予给想要渲染的对象
  4. 在材质面板中调整unity shader的相关属性,以达到最终效果

unity中的shader必须配合材质才能正常使用

Unity中shader类型

  1. standard surface shader(标准曲面着色器)
    包含标准光照模型的表面着色器模板
  2. Unlit shader
    不包含光照的基本顶点/片元着色器
  3. Image Effect Shader
    用于实现屏幕后处理效果的基本模板
  4. Compute Shader
    利用GPU并行计算一些和常规渲染流水线无关的内容
  5. Ray Tracing Shader
    用于实现光线追踪效果的着色器

学习重点主要是顶点/片元着色器

ShaderLab基本结构

ShaderLab主要由4个部分组成

  1. shader的名字
  2. shader的属性
  3. 1~n个子着色器
  4. 备用的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.关于默认值后面的 {},固定写法(老版本中括号内可以控制固定函数纹理坐标的生成,但是新版本中没有该功能了)

评论