US2S2L4——Shader的属性

回顾:ShaderLab的基本结构

ShaderLab主要由4个部分组成

  1. Shader的名字
  2. Shader的属性
  3. 1~n个子着色器
  4. 备用的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 //一般使用脚本创建,极少使用,了解即可

Shader的属性

在Shader编写时我们经常会用到不同类型的变量或贴图等资源
为了增加Shader的可调节性,有些变量不会直接在Shader程序中写死
而是作为开放的属性显示在我们的材质面板上,供我们使用时调节

而这些开放的属性就是通过属性 Properties​ 来定义的

Shader的属性具有两个特点:

  1. 可以在材质面板被编辑

  2. 可以在后续当作输入变量提供给所有子着色器使用

    如何使用,详见:US2S3L11——ShaderLab属性类型和CG变量类型的匹配关系

Shader的属性主要就是三种类型:数值、颜色和向量、纹理贴图

Shader的属性的基本语法

  1. 在Shader文件中

    Shader属性是存在于Shader语句块中的 Properties​ 属性语句块
    我们只需要在 Properties​ 语句块中按照语法规则声明属性即可

    1
    2
    3
    4
    5
    6
    7
    8
    Shader "TeachShader/Lesson4"
    {
    Properties
    {
    _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader { ... }
    }
  2. 属性的基本语法

    1
    _Name("Display Name", type) = defaultValue[{options}]
    • _Name​:属性名字,规则是需要在前面加一个下划线,方便在之后获取
    • Display Name​:材质 Inspector 面板上显示的名字,注意,如果此Shader文件非UTF8编码的,则中文属性无法正常显示
    • type​:属性的类型
    • defaultValue​:将Shader指定给材质的时候初始化的默认值

    注意,在Shader中,语句结束不需要加 ;

  3. Unity Shader的属性主要分成三大类:数值、颜色和向量、纹理贴图

    1. 数值类型属性

      注意:Unity Shader中的数值类型属性基本都是浮点型(Float​)数据
      虽然提供了整数(Int​),但是编译时最终都会转换为浮点型
      因此我们更多的使用的还是Float​类型

      1. 整形

        1
        _Name("Display Name", Int) = number

        示例:

        1
        2
        3
        4
        5
        6
        Properties
        {
        _MainTex ("Texture", 2D) = "white" {}
        _MyInt("MyInt", Int) = 1
        _MyFloat("MyFloat", Float) = 0.5 //不要加f!!!
        }

        在Inspector窗口上显示效果:

        image

      2. 浮点型

        注意,ShaderLab不是C#,我们不需要在默认的浮点数后面添加f​,否则会报错!

        1
        _Name("Display Name", Float) = number

        示例:

        1
        2
        3
        4
        5
        6
        Properties
        {
        _MainTex ("Texture", 2D) = "white" {}
        _MyInt("MyInt", Int) = 1
        _MyFloat("MyFloat", Float) = 0.5 //不要加f!!!
        }

        在Inspector窗口上显示效果:

        image

      3. 范围浮点型

        注意,ShaderLab不是C#,我们不需要在默认的浮点数后面添加f​,否则会报错!

        1
        _Name("Display Name", Range(min,max)) = number

        示例:

        1
        2
        3
        4
        5
        6
        7
        Properties
        {
        _MainTex ("Texture", 2D) = "white" {}
        _MyInt("MyInt", Int) = 1
        _MyFloat("MyFloat", Float) = 0.5 //不要加f
        _MyRange("MyRange", Range(1, 5)) = 2 //不要加f
        }

        在Inspector窗口上显示效果:

        image

    2. 颜色和向量类型属性

      颜色和向量类型属性之所以归纳在一起,是因为:

      • 颜色是由RGBA四个分量代表
      • 向量是由XYZW四个分量代表

      他们都可以由一个四个数组成的类型表示

      1. 颜色

        注意:颜色值中的RGBA的取值范围是 0~1 (映射0~255),同样数字不要加f

        1
        _Name("Display Name", Color) = (number1,number2,number3,number4)

        示例:

        1
        2
        3
        4
        Properties
        {
        _MyColor("MyColor", Color) = (0.5, 0.5, 0.5, 0.5) //不要加f!
        }

        在Inspector窗口上显示效果:

        image

      2. 向量

        注意:向量值中的XYZW的取值范围没有限制,同样数字不要加f

        1
        _Name("Display Name", Vector) = (number1,number2,number3,number4)

        示例:

        1
        2
        3
        4
        Properties
        {
        _MyVector("MyVector", Vector) = (99, 95, 93, 123) //不要加f!
        }

        在Inspector窗口上显示效果:

        image

    3. 纹理贴图类型属性

      1. 2D 纹理

        最常用的纹理,漫反射贴图、法线贴图都属于2D纹理

        1
        _Name("Display Name", 2D) = "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. 关于默认值后面的 {}​ 它是固定写法,(老版本中括号内可以控制固定函数纹理坐标的生成,但是新版本中没有该功能了)

        示例:

        1
        2
        3
        4
        Properties
        {
        _My2D("My2D", 2D) = "White"{}
        }

        在Inspector窗口上显示效果:

        image

      2. 2DArray 纹理

        纹理数组,允许在纹理中存储多层图像数据,每层看做一个2D图像,一般使用脚本创建,较少使用,了解即可

        1
        _Name("Display Name", 2DArray) = "defaulttexture"{}

        示例:

        1
        2
        3
        4
        Properties
        {
        _My2DArray("My2DArray", 2DArray) = ""{}
        }
      3. Cube map texture纹理

        立方体纹理,由前后左右上下6张有联系的2D贴图拼成的立方体,比如天空盒和反射探针

        1
        _Name("Display Name", Cube) = "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. 关于默认值后面的 {}​ 它是固定写法,(老版本中括号内可以控制固定函数纹理坐标的生成,但是新版本中没有该功能了)

        示例:

        1
        2
        3
        4
        Properties
        {
        _MyCube("MyCube", Cube) = ""{}
        }

        在Inspector窗口上显示效果:

        image

        Cube属性关联的贴图类型是CubeMap,可以右键 —— Create —— Legacy —— Cubemap创建

        image

      4. 3D纹理

        一般使用脚本创建,极少使用,了解即可

        1
        _Name("Display Name", 3D) = "defaulttexture"{}

        示例:

        1
        2
        3
        4
        Properties
        {
        _My3D("My3D", 3D) = ""{}
        }