本章目标:

  • 学习UnityShaderASE模版设置

  • 学习如何定义Shader模版

配置环境:

  • VScode

  • Unity2022·····

  • Shader入门精要


一、添加修改ASE的Shader模版

1、找到ASE插件中的模版库(在Templats的Legacy下)

2、ASE可视化面板对于Shader编辑的基本逻辑

这些注释就是ASE读取来生成相应的shader代码的内容,都是通过直接在shader文件中作用

ASE工作注释

(1)/*ase_name*/

Shader /*ase_name*/ "Hidden/Templates/DoublePassUnlit" /*end*/
//这是Shader名称的占位符,用于在Shader代码中标识Shader的名称。它通常用于生成Shader的类名或文件名.
  • 作用:在编译时,/*ase_name*/会被替换为具体的Shader名称,例如"UnlitShader"。

  • /*end*/:表示占位符的结束标记。

(2)/*ase_props*/

Properties
{
    /*ase_props*/
}
//这是Shader属性(Properties)的占位符,用于动态生成Shader的属性部分。这些属性通常包括纹理、颜色、浮点值等,由ASE的节点编辑器定义。

作用:在编译时,/*ase_props*/会被替换为具体的属性定义。例如:

Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    _Color ("Color", Color) = (1,1,1,1)
}

(3)/*ase_subshader_options*/

/*ase_subshader_options:Name=Additional Options
    Option:Vertex Position,InvertActionOnDeselection:Absolute,Relative:Relative
        Absolute:SetDefine:ASE_ABSOLUTE_VERTEX_POS 1
        Absolute:SetPortName:1,Vertex Position
        Relative:SetPortName:1,Vertex Offset
*/
//这是SubShader选项的占位符,用于动态生成SubShader的配置选项。这些选项通常包括渲染状态(如混合模式、深度测试等)和条件编译指令。
  • 作用:在编译时,/*ase_subshader_options*/会被替换为具体的SubShader配置代码。

  • 示例

#pragma multi_compile _ ASE_ABSOLUTE_VERTEX_POS

(4)/*ase_pass*/

/*ase_pass*/
Pass
{
    Name "Unlit"
    Blend Off
    ZWrite On
    ZTest Always
    CGPROGRAM
    ...
    ENDCG
}
//这是Pass部分的占位符,用于动态生成Shader的Pass代码。每个Pass定义了Shader在渲染过程中的一个阶段,例如前向渲染、阴影渲染等。

作用:在编译时,/*ase_pass*/会被替换为具体的Pass代码,包括顶点着色器和片元着色器的定义。

(5)/*ase_pragma*/

#pragma vertex vert
#pragma fragment frag
/*ase_pragma*/

//这是#pragma指令的占位符,用于动态生成Shader编译指令。这些指令通常用于指定Shader的编译选项,如顶点着色器和片元着色器的入口函数。

作用:在编译时,/*ase_pragma*/会被替换为额外的#pragma指令,例如:

#pragma multi_compile_instancing

(6)/*ase_vdata*/

struct appdata
{
    float4 vertex : POSITION;
    float4 color : COLOR;
    /*ase_vdata:p=p;c=c*/
    UNITY_VERTEX_INPUT_INSTANCE_ID
};
//这是顶点数据(Vertex Data)的占位符,用于动态生成顶点输入结构体的定义。

作用:在编译时,/*ase_vdata*/会被替换为额外的顶点数据定义,例如:

float2 uv : TEXCOORD0;

(7)/*ase_interp*/

struct v2f
{
    float4 vertex : SV_POSITION;
    /*ase_interp(1,):sp=sp.xyzw;wp=tc0*/
    UNITY_VERTEX_OUTPUT_STEREO
};
//这是插值器(Interpolator)的占位符,用于动态生成从顶点着色器到片元着色器的插值变量。

作用:在编译时,/*ase_interp*/会被替换为具体的插值变量定义,例如:

float2 uv : TEXCOORD0;

(8)/*ase_globals*/

/*ase_globals*/
//这是全局变量的占位符,用于动态生成Shader中的全局变量定义。

作用:在编译时,/*ase_globals*/会被替换为具体的全局变量定义,例如:

sampler2D _MainTex;
float4 _MainTex_ST;

(9)/*ase_vert_code*/和/*ase_frag_code*/

/*ase_vert_code:v=appdata;o=v2f*/
/*ase_frag_code:i=v2f*/
//这些是顶点着色器和片元着色器代码的占位符,用于动态生成具体的着色器逻辑。

作用:在编译时,这些占位符会被替换为具体的顶点或片元着色器代码,例如:

o.uv = v.uv * _MainTex_ST.xy + _MainTex_ST.zw;

3、对于自定义ASE模版编辑的注意事项

(1)多Pass设置

  1. 多Pass设置中的增加pass和结束增加pass的方法

//注意:找到ASE模版Pass一栏
/*ase_all_modules*/
//第一个pass,只有一个pass不需要pass_end
/*ase_pass*/
Pass
{...}

//第二个pass,需要在结尾加上/*ase_pass_end*/语句
/*ase_pass*/
Pass
{...}
/*ase_pass*/
Pass
{...}
/*ase_pass_end*/