CGINCLUDE 关键字的作用

在shader代码里经常会看到有这个关键字:CGINCLUDE,不注意的话很可能会和 CGPROGRAM 搞混淆,虽然这两个关键字都需要 ENDCG 来结束生效范围。在 CGINCLUDE 和 ENDCG 范围内可以插入一些shader代码,比如变量声明,结构体定义,函数实现等,如下:

    CGINCLUDE

    sampler2D _MainTex;

    struct vertex_data

    {

        float4 vertex : POSITION;

        float4texcoord : TEXCOORD0;

    };


    float4 frag(v2f i) : COLOR

    {

        float4color;

        color =tex2D(_MainTex, i.uv);

        returncolor;

    }

    ENDCG

unity会把 CGINCLUDE 和 ENDCG 之间的代码插入到每一个pass中,已达到声明一遍,多次使用的目的。(参考)例如,可以在 CGINCLUDE 和 ENDCG 之间 定义多个 顶点和片段方法,在pass里只要写明 #pragma vertex 顶点方法名 #pragma fragment 片段方法名 即可,而不用写具体的函数实现。如下:

    pass

    {

        Tags{"Queue"="Geometry"}

        ZWrite On

        ZTest LEqual

        Cull Back


        CGPROGRAM

        #include"UnityCG.cginc"

        #pragmavertex vert

        #pragmafragment frag

        ENDCG

        }


        pass

        {

        Tags{"Queue"="Transparent"}

        ZWrite Off

        blend srcalpha oneminussrcalpha


        CGPROGRAM

        #pragmavertex vert2

        #pragmafragment frag2

        ENDCG

    }

在第一个pass中使用 vert 和 frag 方法,在第二个pass中使用 vert2 和 frag2 方法。

完整shader如下:

    Shader"MJ/Test"

    {

        Properties

        {

            _MainTex("Main Texture", 2D) ="white"

        }

        CGINCLUDE

        sampler2D_MainTex;

        structvertex_data

        {

            float4 vertex : POSITION;

            float4 texcoord : TEXCOORD0;

        };


        structv2f

        {

            float4 position : SV_POSITION;

            float2 uv : TEXCOORD0;

        };


        v2f vert1(vertex_data v)

        {

            v2f o;

            o.position =mul(UNITY_MATRIX_MVP, v.vertex);

            o.uv = v.texcoord;

            returno;

        }


        v2f vert2(vertex_data v)

        {

            v2f o;

            o.position =mul(UNITY_MATRIX_MVP, v.vertex);

            o.uv = v.texcoord;

            returno;

        }


        float4 frag1(v2f i) : COLOR

        {

            return float4(1,0,0,1);

        }


        float4 frag2(v2f i) : COLOR

        {

            return float4(0,1,0,1);

        }

        ENDCG


        Subshader

        {

            pass

            {

                Tags{"Queue"="Transparent"}


                CGPROGRAM

                #include"UnityCG.cginc"

                #pragmavertex vert1

                #pragmafragment frag1

                ENDCG

            }


            pass

            {

                Tags{"Queue"="Transparent"}

                blend srcalpha oneminussrcalpha


                CGPROGRAM

                #pragmavertex vert2

                #pragmafragment frag2

                ENDCG

            }

        }

    }

参考链接:

: https://forum.unity.com/threads/what-is-the-command-of-cginclude.279175/

你可能感兴趣的:(CGINCLUDE 关键字的作用)