美文网首页综合
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