【Unity】ShaderLab-1-基本结构和语法

一篇Shader看完 Shader 基础语法



/**********
*
* 作者 : Quaye
* 时间 : 2018.05.23
*
* 描述 :
*       一篇 shader 看懂 ShaderLab 基础语法
**/

Shader "Quaye/ShaderStructure"
{
    // Properties 语句块属性定义,仅仅是在Unity材质面板中显示这些属性而已
    Properties
    {
        //
        // 属性定义 :Name("display name",PropertyType) = DefaultValue
        //                      
        //
        // 解释       :
        //  *   Name            : 在Shader中访问用到的名字,命名规则:下划线开头 _Name
        //  *   "display name"  : 在属性面板显示的名称
        //  *   PropertyType    : 属性类型
        //
        //  属性列表:
        //  |-----------------------------------------------------------------------------------|
        //  |   TYPE            | INIT FUNCTION         | SAMPLE                                |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   Int             | number                | _Int("Int",Int) =2                    |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   Float           | number                | _Float("Float",Float) = 1.5           |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   Range(min,max)  | number                | _Range("Range",Range(0.0,5.0)) = 3.0  |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   Color           | (num,num,num,num)     | _Colort("Color",Color) = (1,1,1,1)    |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   Vector          | (num,num,num,num)     | _Vector("Vector",Vector) = (2,3,6,1)  |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   2D              | "defaulttexture"{}    | _2D("2D",2D) = ""{}                   |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   Cube            | "defaulttexture"{}    | _Cube("Cube",Cube) = "white"{}        |
        //  |-------------------|-----------------------|---------------------------------------|
        //  |   3D              | "defaulttexture"{}    | _3D("3D",3D) = "black"{}              |
        //  |-------------------|-----------------------|---------------------------------------|
        //  列表解释:
        //  *   "defaulttexture"{}:
        //              -"defaulttexture":要么是空字符串(""),要么是内置纹理名称("white"、"black"、"gray"、"bump")
        //              -{}              :用于指定纹理属性,例如:TexGen CubeReflect、TexGen CubeNormal来控制固定管线的纹理坐标生成

        _Int("Int",Int) = 2
        _Float("Float",Float) = 1.5
        _Range("Range",Range(0.0,5.0)) = 3.0
        _Colort("Color",Color) = (1,1,1,1)
        _Vector("Vector",Vector) = (2,3,6,1)
        _2D("2D",2D) = ""{}
        _Cube("Cube",Cube) = "white"{}
        _3D("3D",3D) = "black"{}
    }


    //
    // SubShader{
    //      显卡 A 使用的自着色器
    // }
    // SubShader{
    //      显卡 B 使用的自着色器
    // }
    // 每个Unity Shader 最少要包含一个SabShader,当 Unity 需要加载这个Unity Shader时,Unity会扫描所有的
    // SabShader 语义块儿,然后选择一个能够在目标平台上运行的 SubShader,如果不支持的话,Unity 就会使用
    // Fallback 语义指定的 Unity Shader.
    //
    SubShader
    {
        //
        // [Tags]       : 告诉 Unity “怎样”、“何时”渲染这个对象
        //
        // 写法           : Tags{ "TagName1"="Value1" "TagName2"="Value2" } 
        //
        // -    Queue               : 控制渲染顺序指定该物体属于哪一个渲染队列
        //                  - Background        1000        背景物体        
        //                  - Geometry          2000        不透明物体       
        //                  - AlphaTest         2450        透明测试物体  
        //                  - Transparent       3000        透明物体(从后先前渲染)    
        //                  - OverLay           4000        叠加效果层   
        //
        // -    RenderType          : 对着色器进行分类
        //
        // -    DisableBathcing     : 是否对该SubShader使用批处理
        //
        // -    ForceNoShadowCasting: 是否投射阴影
        //
        // -    IgnoreProjector     : 如果是“True”那么使用该SubShader的物体不受Projector影响,通常用于半透明物体
        //
        // -    CanUseSpriteAtlas   : 当前SubShader是用于Sprites时,将该标签设置为false
        //
        // -    PriviewType         : 指名材质面板将如何预览材质
        //

        //
        // [RenderSetup]: 可选的;设置显卡的各种状态
        //
        //  -   Cull    : 设置剔除模式
        //      
        //          - Cull Back | Front | Off    剔除背面/正面/关闭剔除
        //
        //  -   ZTest   : 设置深度测试时使用的函数
        //      
        //          - ZTest Less Greater | LEqual | GEqual | Equal | NotEqual | Always
        //
        //  -   ZWrite  : 开启/关闭 深度写入
        //
        //          - ZWrite On | Off
        //
        //  -   Blend   :   开启并设置混合模式,Blend混合等式
        //          
        //          - Blend Off                 : 关闭混合
        //
        //          - Blend SrcFactor DstFactor :
        //                          开启混合并设置混合因子,源颜色(片元产生的颜色)*SrcFactor,而目标颜色(已经存在
        //                          于颜色缓存的颜色)*DstFactor,然后把两者相加后在存入颜色缓冲中
        //
        //          - Blend SrcFactor DstFactor,SrcFactorA DstFactorA :
        //                          和上面几乎一样,只是使用不同的因子来混合透明通道,其中Blend关键词是命令,后面依
        //                          次是作用于源、目标颜色的混合因子,混合因子的值有如下:
        //                       One          : 因子为 1
        //                       Zero         : 因子为 0
        //                       SrcColor     : 因子为源颜色值
        //                       SrcAlpha     : 因子为源颜色透明通度0值(a通道)
        //                       DstColor     : 因子为目标颜色值
        //                       DstAlpha     : 因子为目标颜色透明通度0值(a通道)
        //                       OneMinusSrcColor: 因子为1-源颜色值
        //                       OneMinusSrcAlpha: 因子为1-源颜色透明通度0值(1-a通道)
        //                       OneMinusDstColor: 因子为1-目标颜色值
        //                       OneMinusDstAlpha: 因子为1-目标颜色透明通度0值(1-a通道)
        //
        //          - BlendOp BlendOperation    :
        //                          并非是把原颜色和目标颜色简单相加后混合,而是使用Blend对它们进行其他操作,支持的
        //                          混合操作有如下
        //                                          
        //                       Add           : 混合后
        //                                    O_rgb = SrcFactor_rgb * S_rgb + DstFactor_rgb * D_rgb
        //                                    O_a = SrcFactor_a * S_a + DstFactor_a * D_a
        //                       Sub           :
        //                                    O_rgb = SrcFactor_rgb * S_rgb - DstFactor_rgb * D_rgb
        //                                    O_a = SrcFactor_a * S_a - DstFactor_a * D_a
        //                       RevSub        :
        //                                    O_rgb = DstFactor_rgb * D_rgb - SrcFactor_rgb * S_rgb
        //                                    O_a = DstFactor_a * D_a - SrcFactor_a * S_a
        //                       Min           :
        //                                    O_rgba = (min(Sr,Dr),min(Sg,Dg),min(Sb,Db),min(Sa,Da))
        //                       Max           :
        //                                    O_rgba = (max(Sr,Dr),max(Sg,Dg),max(Sb,Db),max(Sa,Da))
        //                       Other Operation :
        //                                      仅在DirectX 11.1 中支持
        //
        //
        //          - 常用混合模式:
        //
        //              正常(Normal), 即透明度混合
        //                  Blend   SrcAlpha OneMinusSrcAlpha   
        //
        //              柔和相加(Soft Additive)
        //                  Blend   OneminusDstColor One
        //
        //              正片叠底(Multiply), 即相乘
        //                  Blend   DstColor Zero
        //
        //              两倍相乘(2 x Multiply)
        //                  Blend   DstColor SrcColor
        //
        //              变暗(Darken)
        //                  BlendOp Min             
        //                  Blend   One One
        //
        //              滤色(Scren)
        //                  Blend   OneMinusDstColor One
        //              <=> Blend   One OneMinusSrcColor
        //
        //              线性减淡(Linear Dodge)
        //                  Blend   One One
        //
        //
        //



    
        //
        //  Use Pass    : 使用其他UnityShader中的Pass;
        // Grab Pass   : 负责抓取屏幕并将结果存储在一张纹理中,用于后续Pass处理
        //
        Pass    
        {
            // [Name]
            
            // [Tags]   :   Pass的标签,告诉渲染引擎怎样渲染该物体
            // -    LightMode       : 定义该Pass在Unity的渲染流水线中的角色
            // -    RequireOptions  : 用于当满足某些条件时才渲染该Pass
            
            // [RenderSetup]

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            // 支持包含头文件,在Unity中他们的后缀为“.cginc”
            #include "UnityCG.cginc"

            //  CG/HLSL中3种精度的数值类型
            //  |---------------------------------------------------------------------------
            //  |   TYPE    |   精度
            //  |-----------|---------------------------------------------------------------
            //  |   float   |   最高精度浮点数,通常使用 32位 来存储
            //  |-----------|---------------------------------------------------------------
            //  |   half    |   中等精度浮点数,通常使用 16位 来存储,-60000 ~ +60000
            //  |-----------|---------------------------------------------------------------
            //  |   fixed   |   最低精度浮点数,通常使用 11位 来存储,-2.0 ~ +2.0
            //  |-----------|---------------------------------------------------------------
            float4 _Diffuse;

            // a :  application     应用
            // v : vertex shader   顶点着色
            struct a2v      
            {
                //  Unity支持的常用语义:应用阶段 ---传递模型数据---> 顶点着色器
                //  |-----------------------------------------------------------------------------------
                //  |   POSITION        |   模型空家中的顶点位置,通常是 float4 类型
                //  |-------------------|---------------------------------------------------------------
                //  |   NORMAL          |   顶点法线,            通常时 float3 类型
                //  |-------------------|---------------------------------------------------------------
                //  |   TANGENT         |   顶点切线,            通常时 float4 类型
                //  |-------------------|---------------------------------------------------------------
                //  |   TEXCOODn        |   该顶点的纹理坐标,TEXCOORD0 表示第一组纹理坐标,通常float2/float4
                //  |-------------------|---------------------------------------------------------------
                //  |   Color           |   顶点颜色,            通常时 fixed4/float4 类型
                //  |-------------------|---------------------------------------------------------------
            };

            // f : vertex shader   片源着色
            struct v2f      
            {
                //  Unity支持的常用语义:顶点着色器 ---数据---> 片元着色器
                //  |-----------------------------------------------------------------------------------
                //  |   SV_POSITION     |   剪裁空间中的顶点坐标,结构中必须包含一个用该予以修饰的变量
                //  |                   |   <=>(等价于)
                //  |                   |   DirectX9中的 POSITION 但最好使用 SV_POSITION
                //  |-------------------|---------------------------------------------------------------
                //  |   COLOR0          |   通常用于输出第一组顶点颜色,但不是必要的
                //  |-------------------|---------------------------------------------------------------
                //  |   COLOR1          |   通常用于输出第二组顶点颜色,但不是必要的
                //  |-------------------|---------------------------------------------------------------
                //  |   TEXCOORD0~7     |   通常用于输出纹理坐标,但不是必要的
                //  |-------------------|---------------------------------------------------------------
           };


            //float4 vert(float4 v:POSITION-输入语义) :SV_POSITION-输出语义
            float4 vert(float4 v:POSITION) :SV_POSITION
            {

                return UnityObjectToClipPos(v);// 等价于 mul(UNITY_MATRIX_MVP,*)
            }

            float4 frag() : SV_TARGET
            {
                //  Unity支持的常用语义:片元着色器 ---输出---> Unity
                //  |-----------------------------------------------------------------------------------
                //  |   SV_Target       |   输出值将会存储到渲染目标(render target)中。
                //  |                   |   <=>(等价于)
                //  |                   |   DirectX9中的 COLOR, 但最好使用 SV_Target
                //  |-------------------|---------------------------------------------------------------
                return fixed4(1.0,1.0,1.0,1.0);
            }

            ENDCG
        }
    }
    //
    // 如果上面所有的 SubShader 在这块显卡上都不能运行,那么就使用最低级的 Shader;
    //
    Fallback Off // 或者 Fallback "name" : Fallback "VertexLit"
    
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值