其他分享
首页 > 其他分享> > 读UnityShader入门精要第三章-Unity Shader基础

读UnityShader入门精要第三章-Unity Shader基础

作者:互联网

1.Unity Shader概述

1.1  材质和Unity Shader

  在Unity中材质(Meterial)和Unity Shader需要配合使用,一个常见的流程是:

  1)创建一个材质;

  2)创建一个Unity Shader,并把它赋给上一步中创建的材质;

  3)把材质赋给要渲染的对象;

  4)在材质面板中调整Unity Shader的属性,以得到满意的效果.

  可见,Unity Shader负责定义渲染所需的各种代码\属性和指令等,而材质则允许我们调节这些属性,并将其最终赋给相应的模型.如下图:

 

2.Unity Shader基础:ShaderLab

  学习和编写着色器的学习曲线相对来说是很陡峭的,通常情况下为了实现一个自定义的渲染效果需要和很多文件和设置打交道,因此Unity为开发者提供了更高层级的渲染抽象层-ShaderLab.

  Unity中所有的Unity Shader都是使用ShaderLab编写,ShaderLab是Untiy提供的编写Unity Shader的一种说明性语言.它使用了一些嵌套在花括号内部的语义(syntax)来描述一个UnityShader文件的结构,如Porperties语句块中定义了着色器所需的各种属性,这些属性将会出现在材质面板中.

3.Unity Shader的结构

  在Unity中创建一个默认的Shader,并打开:

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            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
        }
    }
}

3.1  Shader名称

  第一行代码为:

Shader "Unlit/NewUnlitShader"

  这指明了Shader的位置和名称,在指定Shader时可以在Unlit分类下找到这个Shader:

3.2  材质和Unity Shader的桥梁:Properties

  在Properties语句块中定义了一系列属性,这些属性将出现在材质面板中:

    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }

  如代码所示,属性定义的基本格式是: 属性名字  {属性显示名称, 属性类型} = 属性默认值.其中属性名字类似于代码中的字段名,用于在Shader中找到属性并读写属性的值,一般取名时以下划线开头;属性显示名称是在材质中显示的名称(如下图所示),属性类型有Int,Float等(如下表所示).

3.3  重量级成员: SubShader

  每个Unity Shader都必须包含至少一个SubShader语句块.当Unity需要加载这个Unity Shader时,Unity会扫描所有的SubShadre语句块,然后选择第一个能够在目标平台上运行的SubShader.如果都不支持的话,Unity就会使用Fallback语义指定的Unity Shader.

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            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
        }
    }

  如上面的代码所示,一个SUbShader中定义了一些自语句块,其中Tags语句块指标签设置,是可选的;RenderSetup是可选的状态设置,也是可选的;Pass语句块中定义了完整的渲染流程,一个Pass语句块定义一个完整的渲染流程,一个SubShader中一定至少包含一个Pass语句块.

  1)Tags标签:一个Tags标签由至少一个键值对组成,键和值都是字符串,类型的.这些键值对标识了我们希望怎样以及何时渲染当前对象.

 

  2)RenderSetup状态设置:ShaderLab提供了一系列渲染状态的设置指令,可以设置显卡的各种状态,如是否开启混合\深度测试等.

  3)Pass语义块:在Pass语义块中可以定义这个Pass语义块的名称,同时也可以使用UsePsss命令来直接使用其他Unity Shader中的Pass,以提高代码的复用性.在Pass语义块中也可以定义局部的Tags和RenderSetup(仅在本Pass语义块内部生效).

3.4  Fallback

  在Unity Shader中,可以在所有SubShader编写完成后,可选性地编写一个Fallback指定,指令可以是Fallback+字符串或者Fallback off.

  Fallback指定指明了当这个Shader中所有的SubShader都无法生效时,可以使用的一个默认Shader,或者使用Fallback off指令关闭Fallback功能.

标签:MainTex,vertex,Shader,Unity,UnityShader,Pass,属性
来源: https://www.cnblogs.com/movin2333/p/16536209.html