文章

着色器语法解析01

着色器语法解析01

着色器语法解析01

官方文档

通用渲染管线概述 | Universal RP | 12.1.1 (unity3d.com)

Propertise块

Unity - Manual: ShaderLab: defining material properties (unity3d.com)

Unity - Scripting API: MaterialPropertyDrawer (unity3d.com)

Propertise块UI语句

1
2
3
[Header(Custom Material Inspector)]//代表面板标题
[Space]//代表空一个单位距离
[Space(50)]//代表空50个单位距离

着色器参数声明格式如下

1
[optional: attribute] name("display text in Inspector", type name) = default value

[optional: atrribute]

  • 作用: 用于配置特殊的参数规则.

  • 规则: optional: atrribute(可配置属性), 不区分大小写, 但渲染组规则为”首字母大写+驼峰式大小写(Camel-Case)”.

  • 进阶参数:

    • [MaterialToggle]: 勾选框, 结果是, 当界面上该勾选框勾选时, 返回1, 未勾选时, 返回0. 通常和预编译宏配合使用. 关于预编译, 其中multi_compile是全局预编译, key数量上限为256, multi_compile_local是本地, key数量上限为64.

      1
      2
      3
      4
      5
      6
      7
      8
      
      [MaterialToggle]_Toggle("勾选框", Float) = 0
      //对应的预编译伪代码
      #pragma multi_compile_local __ _TOGGLE_ON
      #ifdef TOGGLE01_ON
          DoSomething();
      #else
          DoSomethingElse();
      #endif
      
    • [Toggle]: 勾选框, 同[MaterialToggle].

    • [Toggle(KEYWORD)]: 直接指定KeyWord, 而不是通过变量名直接生成.

      1
      2
      3
      4
      5
      6
      7
      8
      
      [Toggle(ENABLE_EXAMPLE_FEATURE)] _ExampleFeatureEnabled ("Enable example feature", Float) = 0
      //对应的预编译伪代码
      #pragma multi_compile __ ENABLE_EXAMPLE_FEATURE
      #ifdef ENABLE_EXAMPLE_FEATURE
          DoSomething();//勾选激活
      #else
          DoSomethingElse();//不勾选激活
      #endif
      
    • [ToggleOff(KEYWORD)]: 勾选框, 所不同的是, 该勾选框, 在勾选时, 是把KeyWord关闭, 不勾选时是激活.

      1
      2
      3
      4
      5
      6
      7
      8
      
      [ToggleOff(_FEATURE_TEST)]_Toggle03("勾选框OFF", Int) = 0
      //对应的预编译伪代码
      #pragma multi_compile_local __ _FEATURE_TEST
      #ifdef _TOGGLE_TEST
          DoSomething();//不勾选激活
      #else
          DoSomethingElse();//勾选激活
      #endif
      
    • [Enum(选项1,值1,选项2,值2,选项3,值3…)]: 下拉选择, 结果是, 选项对应返回值. 选项和值最多能支持7组. 具体可见Unity - Scripting API: MaterialPropertyDrawer (unity3d.com)

      1
      
      [Enum(Off,0,On,1)]_ZWrite("ZWrite", float) = 0
      
    • [Enum(任意枚举)]: 下拉选择, 通过预先定义的枚举定义选项以及值. Unity内建渲染部分的枚举Unity - Scripting API: BlendMode (unity3d.com).

      image-20220526103555483

      1
      2
      3
      4
      5
      
      [Enum(UnityEngine.Rendering.CullMode)]_Cull("Cull Mode", Int) = 2
      [Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("SrcBlend Mode", Int) = 5
      [Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("DstBlend Mode", Int) = 10
      [Enum(UnityEngine.Rendering.BlendOp)]_BlendOp("Blend Op", Int) = 0
      [Enum(UnityEngine.Rendering.CompareFunction)]_ZTest("ZTest", Int) = 4
      
    • [KeywordEnum(KEYWORD1, KEYWORD2, KEYWORD3…)]: 关键词枚举, 通常和预编译宏配合使用.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0
      //对应的预编译伪代码
      #pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY
      #ifdef _OVERLAY_NONE
          DoSomething01();
      #endif
      #ifdef _OVERLAY_ADD
      	DoSomething02();
      #endif
      #ifdef _OVERLAY_MULTIPLY
      	DoSomething03();
      #endif
      
参考网页
本文由作者按照 CC BY 4.0 进行授权