Unity Shader 基础结构 常用语法大全

2019-08-23  本文已影响0人  Jaymz_2b11

Unity Shader基础结构 常用语法

//顶点/片元着色器代码模板
Shader "Hidden/ShaderTemplate"
{
    //Hidden 表示此Shader 无法在面板中找到 比如最常见的小粉红色ErrorShader 
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color Tint",Color) = (1,1,1,1)
        _Range ("Range",Range(0,10)) = 5
        _Float ("Float",Float) = 4
        _Int ("Int",Int) = 10
        _Vector("Vector",Vector) = (1,2,3,4)
        _Cube ("Cube",Cube) = "white"{}
        _3D ("3D",3D) = "black"{}
    }

    

    //Unity 会扫描所有SubShader语义块,选择第一个可以再目标平台运行的SubShader,假设都不支持,那么会调用Fallback
    SubShader
    {
        //subShader中指定的状态会应用到所有pass
        //SubShader Tags 列表如下 标签设置与Pass中不一样,但语法一致

        Tags{"Queue" = "Transparent" "RenderType" = "Opaque"}  //多Tags 写法
        //Queue 控制渲染顺序,指定渲染队列
        //Queue 选项如下
        //Background 队列索引号 1000  最先渲染
        //Geometry   队列索引号 2000  默认渲染队列,不透明物体使用这个队列
        //AlphaTest  队列索引号 2450  需要透明度测试的使用这个队列 
        //Transparent队列索引号 3000  任何使用了透明度混合(例如关闭了深度写入的Shader)
        //Overlay    队列索引号 4000  可实现叠加效果 任何在需要在最后渲染的物体都需要使用该队列

        //RenderType 对着色器进行分类 可以用于着色器替换功能
        //RenderType 选项如下
        //Opaque 渲染不透明物体时使用
        //Transparnet 渲染透明物体使用

        //DisableBatching 指明是否对该SubShader使用批处理  true | false

        //ForceNoShadowCasting 该SubShader 是否会投射阴影  true | false

        //IgnoreProjector 是否忽略阴影 true | false 

        //CanUseSpriteAtlas 当该SubShader 是用于Sprites 时, 将该标签设为false

        //PreviewType 指明材质面板如何预览该材质 默认情况下,材质将显示为一个球形  Plane | SkyBox

        //[RenderSetUp]
        //设置剔除模式 Back 背面 Front正面 Off关闭
        Cull Off 

        //设置深度测试时 使用的函数
        //Less Greater | LEqual | GEqual | Equal | NotEqual | Always
        ZTest Less Greater

        //深度写入 On | Off  打开 | 关闭
        ZWrite On

        //混合 开启并设置
        Blend SrcAlpha OneMinusSrcAlpha
        //Blend 混合选项
        //Blend Off 关闭混合
        //Blend SrcFactor DstFactor 开启混合并设置混合因子 最终颜色 = 源颜色(该片元产生的颜色)* SrcFactor + 目标颜色(已经存在与颜色缓冲区的颜色)* DstFactor
        //Blend SrcFactor DstFactor,ScrFactorA DstFactorA 与上面一致,只是Alpha通道使用不同的因子来混合
        //BlendOp BlendOperation 混合操作命令

        //混合因子
        //One       因子为1
        //Zero      因子为0
        //SrcColor  因子为源颜色值 混合RGB时 以源颜色RGB分量为因子  混合A时 以源颜色A分量为因子
        //SrcAlpha  因子为源颜色的Alpha值
        //DstColor  因子为目标颜色值
        //DstAlpha  因子为目标颜色值的Alpha值
        //OneMinusSrcColor 因子为 1-源颜色值
        //OneMinusSrcAlpha 因子为 1-源颜色值Alpha分量
        //OneMinusDstColor 因子为 1-目标颜色值
        //OneMinusDstAlpha 因子为 1-目标颜色值Alpha分量
        

        //混合操作命令
        //Add       混合后 源颜色 + 目标颜色
        //Sub       混合后 源颜色 - 目标颜色
        //RevSub    混合后 目标颜色 - 源颜色
        //Min       RGBA分量 在源颜色值与目标颜色值中取最小值 (会忽略混合因子)
        //Max       RGBA分量 在源颜色值与目标颜色值中取最大值 (会忽略混合因子)


        //每个Pass定义了一个完成的渲染流程 SubShader中的Pass 会按顺序全部执行
        Pass
        {
            Name "TemplatePass" //定义Pass名称 可以使用UsePass 直接使用其他UnityShader中的Pass
            UsePass "ShaderTemplate/TemplatePass" //使用其他UnityShader中的Pass

            Tags{"LightMode" = "ForwordBase"}
            //Pass中的Tags 选项如下
            //LightMode 选项列表
            //ForwardBase   前向渲染 该Pass会计算环境光,平行光,逐顶点/SH光源 和 LightMaps
            //Always        不管使用哪种渲染路径,该Pass总是会被渲染,但不计算任何光照
            //ForwardAdd    前向渲染 该Pass会计算额外的逐像素光照,每个Pass对应一个光源
            //Deferred      用于延迟渲染 该Pass会渲染G缓冲
            //ShadowCaster  把物体的深度信息渲染到阴影映射纹理Shadowmap 或 一张深度纹理中
            //PrepassBase   遗留的延迟渲染 该Pass会渲染法线和高光反射的指数部分
            //PrepassFinal  遗留的延迟渲染 该Pass通过合并纹理,光照和自发光来渲染得到最后的颜色
            
            //RequireOptions 用于指定当满足某些条件时才渲染该Pass 目前只支持 SoftVegetation

            CGPROGRAM // Cg/HLSL 代码段
            #pragma vertex vert  //编译指令指明顶点着色器代码
            #pragma fragment frag //指明片元着色器代码
            
            #include "UnityCG.cginc"  //引入unity 内置文件

            //Shader中使用属性 我们需要在CG代码中定义一个与属性名称和类型都匹配的变量
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            half _Range;
            float _Float;
            int _Int;
            float4 _Vector;
            samplerCube _Cube;
            sampler3D _3D;


            
            //浮点类型总结
            //float     32位高精度浮点
            //half      16位中精度浮点 范围[-6w,+6w] 精确到十进制后3.3位
            //fixed     11位低精度浮点 范围[-2,+2] 精度1/256 适用颜色和单位向量使用

            struct a2v //应用阶段数据来源 Render -> UnityShader  application to vertex
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            //语义大全
            //POSITION  用模型空间的顶点坐标填充
            //TANGENT   用模型空间的切线方向填充
            //NORMAL    用模型空间的法线方向填充
            //TEXCOORD0 用模型空间的第一套纹理坐标来填充(一个材质可以有多张贴图)
            //TEXCOORD1 用模型空间的第二套纹理坐标来填充
            //TEXCOORD2 用模型空间的第三套纹理坐标来填充
            //TEXCOORD3 用模型空间的第四套纹理坐标来填充
            //COLOR0    用与储存颜色信息(可自定义)

            //SV_ 表示系统数值语义 System-Value
            //SV_POSITION 顶点着色器的输出裁剪空间中的顶点坐标 顶点着色器最重要的事情就是把顶点坐标从模型空间转换到裁剪空间
            //SV_Target   接受用户输出颜色,输入到默认的帧缓存中


            //此结构定义顶点着色器的输出 vertex to frag
            struct v2f  
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            //顶点着色器代码
            v2f vert (a2v v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);  //顶点的MVP 变换 模型-观察-投影矩阵
                o.uv = v.uv;
                return o;
            }
            
            
            //片元着色器代码
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv); //通过UV坐标对主纹理进行采样
                // just invert the colors
                col = 1 - col;
                return col;
            }
            ENDCG
        }
    }

    Fallback "VertexLit" //最后一条后路 SubShader全不支持 运行指定的Shader 可以关闭Fallback Off
}

上一篇下一篇

猜你喜欢

热点阅读