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也提供了直接访问的方法,不需要开发者自行编码来传给着色器。
相关推荐
沐沐森的故事3 分钟前
Unity之VS脚本自动添加头部注释Package包开发
unity·游戏引擎·注释·注释头·头部注释·scripthead·脚本注释
柠檬味的薄荷心14 分钟前
【Unity2D 2022:Particle System】添加拾取粒子特效
笔记·unity·c#·游戏引擎
仁希'5 小时前
《Unity3D高级编程之进阶主程》第二章 架构(三) - 架构的误区,如何做前端架构,以及如何架构Unity3D项目
笔记·unity·架构
老朱佩琪!12 小时前
Unity分享一个简单的3D角色漫游脚本
3d·unity·游戏引擎
雪 狼13 小时前
unity对于文件夹的操作
windows·unity·游戏引擎
JessieHaha21 小时前
Unity2019.4.5 首页背景图和背景色WebGL
unity·webgl
Angle灬魔君1 天前
Unity【入门】场景切换和游戏退出及准备
游戏·unity·游戏引擎
沐沐森的故事1 天前
Unity 使用AVProMovieCapture实现Game视图屏幕录制
unity·游戏引擎·avpro·moviecapture·录制·游戏录制·game录制
Bunny Chen1 天前
Unity 简单载具路线 Waypoint 导航
unity·游戏引擎
ttod_qzstudio1 天前
Unity中使用VectorGraphics插件时,VectorUtils.RenderSpriteToTexture2D方法返回结果错误的解决方法
unity·vector graphics·spriterenderer