美文网首页综合
Unity shader基础学习(二) ------ Unity

Unity shader基础学习(二) ------ Unity

作者: 千喜Ya | 来源:发表于2019-10-09 10:13 被阅读0次

    本系列文章是学习siki学院Unity Shader入门(Unity2018.3)笔记

    一.Unity创建Shader时4种类型

    1.Standerd Surface Shader : unity对顶点片元的封装.更加方便编写
    2.Unlit Shader : 顶点片元shader
    3.Image Effect Shader : 图片特效shader
    4.Compute Shader : 一般用不到

    Shader Variant Collection : shader库

    渲染需要的东西 :
    1.mesh/particle system
    2.材质球
    3.shader

    二.shader基本结构

    以新建的Unlit Shader为例 :

    1.路径/shader名

    Shader "Unlit/001"   //路径/shader(建议与文件名保持一致)
    

    2.属性块Properties

    //属性块 : 在inspector面板上可以看到
        Properties
        {
            //_Int类型的变量,名称为Int
            _Int("Int",Int) = 2
            //_Float类型的变量,名称为Float
            _Float("Float",float) = 1.5
            //_Range(范围)类型的变量,名称为Range,范围是0.0-2.0(float)
            _Range("Range",range(0.0,2.0))= 1.0
            //_Color(四维变量的颜色值)类型的变量,名称为Color
            _Color("Color",Color) = (1,1,1,1)
            //_Vector : 四维变量,矩阵/多个变量时用_Vector进行传递
            _Vector("Vector",Vector) = (1,4,3,8)
            // Texture : 面板上显示的命名 2D : 类型,是2D图片 white : 默认值,白色 _MainTex : 变量,基本上都会加一个_
            _MainTex("Texture", 2D) = "white" {} 
            //_Cube : 天空盒CubeMap
            _Cube("Cube",Cube) = "white"{}
            //比较少用 : 
            _3D("3D",3D) = "black"{}
        }
    

    3.SubShader

    //真正的变量定义是在这里,可以定义多个SubShader,使用时会根据平台扫描第一个可运行的SubShader进行执行,如果SubShader全都不能执行就会执行Fallback
        SubShader
        {
            //标签 可选  key = value
            Tags 
            {
                "Queue"="Transparent"//渲染顺序
                "RenderType"="Opaque"//着色器替换功能 : 渲染完成之后进行替换
                "DisableBatching" = "True"//是否进行合批 : 动态静态合批
                "ForceNoShadowCasting" = "True"//是否投射阴影
                "IgnoreProjector"="True"//受不受Projector的影响,通常用于透明物体
                "CanUseSpriteAltas" = "False"//是否用于图片的Shader,通常用于UI
                "PreviewType"="Plane"//用作shader面板预览的类型
            }
    
            //Render设置 可选
            //Cull off (裁剪) /back/front   //选择渲染那个面
            //ZTest Always/Less Greater/LEqual/GEqual/Equal/NotEqual //深度测试
            //Zwrite off/on  //深度写入
            //Blend SrcFactor DstFactor//混合
            //LOD 100 //不同情况下使用不同的LOD,达到性能提升
    
            //必须,如果有多个,按照顺序渲染,正常不建议使用多个Pass通多,多一个会多一个drawcall
            Pass
            {
                //Name "Default" //Pass通道名称
                Tags
                {
                    "LightMode"="ForwardBase"//定义该Pass通道在Unity渲染流水中的角色
                    //"RequireOptions"="SoftVegetation"//满足某些条件时才渲染该Pass通道
                } //可以在每个Pass通道里面进行定义
                //Render设置 可以在每个Pass通道里面进行定义
    
                //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;  //定义的变量与Properties中名称保持一致
                float4 _MainTex_ST; //如果在属性块没有,那么要使用C#代码进行传值
                
                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
            }
    
        }
    
        //Fallback "Legacy Shaders/Transparent/VertexLit"  Fallback Off //当上面shader运行不了的时候会使用下面shader渲染
    

    总结:


    相关文章

      网友评论

        本文标题:Unity shader基础学习(二) ------ Unity

        本文链接:https://www.haomeiwen.com/subject/jcpoectx.html