UnityShader——06UnityShader介绍

UnityShader介绍

UnityShader的基础ShaderLab

UnityShader属性块介绍

csharp 复制代码
Properties
{
    //和public变量一样会显示在Unity的inspector面板上
    //_MainTex为变量名,在属性里的变量一般会加下划线,来区分参数变量和临时变量
    //Texture为变量命名
    //2D为类型,为2D图片
    //"white"为默认值,默认为白色
    _MainTex ("Texture", 2D) = "white" {}

    //除了_MainTex以外,还有一些基本类型,比如:
    _Int("Int",int) = 2
    _Float("Float",float) = 1.5
    _Range("Range",range(0.0,2.0) = 1.0
    _Color("Color",Color) = (0,0,0,0)
    _Vector("Vector",Vector) = (0,0,0,0)
    _Cube("Cube",Cube) = "white"{}
    _3D("3D",3D) = "black"{}
}

UnityShader SubShader块介绍

一个Unity Shader文件可以包含很多个SubShader块,当Unity加载Shader的时候,它会扫描所有的SubShader块,选择第一个能在目标平台运行的SubShader

csharp 复制代码
SubShader
{
    //标签可选写或不写 key = value
    Tags 
    { 
        //渲染顺序
        "Queue" = "Transparent"
        //渲染类型 着色器替换功能
        "RenderType"="Opaque"
        //是否进行合批
        "DisableBatching" = "True"
        //是否投射阴影
        "forceNoShadowCasting" = "True"
        //是否收Projector的影响,通常用于透明物体
        "IgnoreProjector" = "True"
        //是否用于图片的Shader,通常用于UI
        "CanUseSpriteAltas" = "False"
        //用作Shader面板预览的类型
        "PreviewType" = "Plane"
    }

    //Render渲染设置 可选写或不写
    //Cull 裁剪,选择渲染哪个面,默认值为只渲染正面
    //Cull off的话就是正反两面都进行渲染
    //Cull back的话就是只渲染正面
    //Cull front的话就是只渲染背面
    Cull off//back/front

    //ZTest 深度测试, 默认小于等于
    ZTest Always//Less Greater/Lequal/GEqual/Equal/NotEqual

    //Zwrite 深度写入,默认为打开
    Zwrite off//on

    //Blend 混合 格式如下
    //Blend SrcFactor DstFactor

    //不同情况下使用不同的LOD达到性能提升
    LOD 100

    //必须要写
    //SubShader里面可以有多个Pass通道,多个Pass通道是按顺序进行渲染的
    //不建议写多个通道,每多一个Pass通道,渲染的DrawCall就多一个,会降低性能
    Pass
    {
        //Pass通道名称,在外部可以直接Use这个通道,相当于函数,但是Use的时候Name必须全部大写
        Name "Default"

        //可以在通道里面书写标签,当通道内外都存在标签,执行的是外面的标签
        Tags
        {
            //定义该Pass通道在Unity渲染流水中的角色
            "LightMode" = "ForwardBase"

            //满足某些条件时才渲染该Pass通道
            "RequireOptions" = "SoftVegetation"
        } 
            
        //Render渲染设置 可以在通道里面书写渲染设置,当通道内外都存在渲染设置,执行的是外面的渲染设置

        //CG语言所写的代码,主要是顶点,片源,着色器
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        // make fog work
        #pragma multi_compile_fog

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            UNITY_FOG_COORDS(1)
            float4 vertex : SV_POSITION;
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            UNITY_TRANSFER_FOG(o,o.vertex);
            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            // sample the texture
            fixed4 col = tex2D(_MainTex, i.uv);
            // apply fog
            UNITY_APPLY_FOG(i.fogCoord, col);
            return col;
        }
        ENDCG
    }
}

注意

Unity Shader ≠ \neq = 真正的Shader

  • Unity Shader实际上指的就是一个ShaderLab文件。以.shader作为后缀的一种文件。在Unity shader里面,我们可以做的事情远多于一个传统意义上的Shader。
  • 在传统的shader中,我们仅可以编写特定类型的Shader,例如顶点着色器,片元着色器等。在Unity Shader中,我们可以在同一个文件里面同时包含需要的顶点着色器和片元着色器代码。
  • 在传统shader中,我们无法设置一些渲染设置,例如是否开启混合,深度测试等,这些是开发者在另外的代码中自行设置的。而Unity shader中,我们通过一行特定的指令就可以完成这些设置。
  • 在传统shader中,我们需要编写冗长的代码设置着色器的输入和输出,要小心的处理这些输入输出的位置对应关系等。而在Unity shader中,我们只需要在特定语句块中声明一些属性,就可以依靠材质来方便的改变这些属性。而对于模型自带的数据(如顶点,纹理坐标,法线等),Unity Shader也提供了直接访问的方法,不需要开发者自行编码来传给着色器。
相关推荐
天涯过客TYGK42 分钟前
unity A星寻路
unity·游戏引擎
KhalilRuan1 小时前
Unity Demo——3D平台跳跃游戏笔记
笔记·游戏·unity·游戏引擎
ttod_qzstudio1 天前
Unity中使用EzySlice实现模型切割与UV控制完全指南
unity
南無忘码至尊1 天前
Unity 实现与 Ollama API 交互的实时流式响应处理
unity·游戏引擎·交互
平行云1 天前
如何实现UE程序大并发多集群的像素流部署
unity·ue5·图形渲染
向宇it2 天前
【unity小技巧】在 Unity 中将 2D 精灵添加到 3D 游戏中,并实现阴影投射效果,实现类《八分旅人》《饥荒》等等的2.5D游戏效果
游戏·3d·unity·编辑器·游戏引擎·材质
向宇it2 天前
Unity Universal Render Pipeline/Lit光照材质介绍
游戏·unity·c#·游戏引擎·材质
__water3 天前
RHA《Unity兼容AndroidStudio打Apk包》
android·unity·jdk·游戏引擎·sdk·打包·androidstudio
两水先木示3 天前
【Unity3D】微信小游戏适配安全区域或胶囊控件(圆圈按钮)水平高度一致方案
unity·微信小游戏·安全区域·ui适配·胶囊控件·safearea
枯萎穿心攻击3 天前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎