Unity Shader 的基本结构

本文由本人简书搬迁至此,并做小幅修改。

代码结构及注释如下:

// 此处定义 Shader 在材质Inspector上选择时的路径。
Shader "NRatelShader/ShaderStructure"
{
    //属性定义
    Properties
    {   
        //此处定义属性。参考《UnityShader入门精要》第29-30页。
        /* + ------------------------------------------------------------------ +
         |                          此处定义属性。                             | 
         | 规则: 属性字段名 ("显示名称", 属性类型) = 默认值                       |
         | 示例: _MainTex ("Texture", 2D) = "white" {}                            |
         | 类型选择: Int、Float、Range(min,max)、Color、Vector、2D、Cube、3D。  |
         + -------------------------------------------------------------------- + */

    }

    //一个Shader文件至少包含一个, 可包含多个, Unity会依次判断, 选择第一个能再目标平台运行的SubShader, 如果都不支持,就会使用FallBack指定的Shader。
    SubShader
    {   
        //此处定义SubShader的Tags(可选的)。 参考《UnityShader入门精要》第31-32页。
        /* + ------------------------------------------------------------------ +
         | 规则: Tags { "键_标签名"="值_标签值" }                             |
         | 示例: Tags { "RanderType"="Opaque" }                                   |
         | 类型选择: Queue、RenderType、DisableBatching、ForceNoShadowCast、    |
         |          IgnorProjector、CanUseSproteAtlas、PreviewType                |
         | 作用: 告诉Unity渲染引擎何时及怎样渲染这个对象                       |
         + -------------------------------------------------------------------- + */
        
        //此处定义SubShader的渲染状态RenderSetUp(可选的)。参考《UnityShader入门精要》第31页。
        /* + ------------------------------------------------------------------ +
         | 规则: 状态名 状态值                                                  |
         | 示例: Cull Back                                                        |
         | 类型选择: Cll、ZTest、ZWrite、Blend。                                |
         | 作用: 设置这些状态后,会应用到所有Pass, 可以在Pass中再次定义覆盖。  |
         + -------------------------------------------------------------------- + */

        // 表面着色器的代码,写在SubShader中的 CGPROGRAM 和 ENDCG 之间而非Pass中。
        // 表面着色器不关心Pass的定义和渲染,由Unity自动处理这些。
        CGPROGRAM
        ENDCG


        //-------------------------如果使用表面着色器, 则不需要定义Pass-----------------------

        Pass
        {
            //此处定义Pass的Name。 参考《UnityShader入门精要》第32页。
            /* + ------------------------------------------------------------------ +
            | 规则: Name "Pass名称"                                                 |
            | 示例: Name "MyNRatelPassName"                                           |
            | 作用: 通过这个名称, 使用ShaderLab的UsePass。                          |
            |       如 UsePass "NRatelShader/MYNRATELPASSNAME" (内部会变大写)      |
            + --------------------------------------------------------------------- + */

            //此处定义Pass的Tags。 参考《UnityShader入门精要》第32页。
            /* + ------------------------------------------------------------------ +
            | 规则: Tags { "键_标签名"="值_标签值" }                              |
            | 示例: Tags { "LightMode"="ForwardBase" }                                |
            | 类型选择: LightMode、RequireOpetions                                   |
            | 作用: 注意它不同于SubShader的Tag。                                  |
            |       但也用于告诉Unity渲染引擎怎样渲染这个对象。                        |
            + --------------------------------------------------------------------- + */
            
            //顶点着色器、片元着色器 的代码写在Pass的 CGPROGRAM 和 ENDCG 之间。
            CGPROGRAM
            ENDCG
        }

        // 除了普通Pass定义, 
        // 还可以使用ShaderLab的 UsePass "NRatelShader/XXXNRATELPASSNAME"。复用其他Shader中的Pass。
        // 还可以GrabPass 负责抓取屏幕并将结果存储在一张纹理中, 以用于后续的Pass处理。
    }

    //此处定义Fallback(可选的)。 参考《UnityShader入门精要》第33页。
    /* + ------------------------------------------------------------------ +
    | 规则: Fallback "name"   或 Fallback Off                                  |
    | 示例: Fallback "VertexLit"                                          |
    | 作用: 设置最低级别的Pass。                                          |
    + --------------------------------------------------------------------- + */
}

猜你喜欢

转载自blog.csdn.net/NRatel/article/details/83663260