美文网首页
CGINCLUDE 关键字的作用

CGINCLUDE 关键字的作用

作者: 上午八点 | 来源:发表于2018-12-13 10:09 被阅读0次

这是 以前文章 改用markdown重新排版了一下,看起来合理多了。
以下是原文:

在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 关键字的作用

    在shader代码里经常会看到有这个关键字:CGINCLUDE,不注意的话很可能会和 CGPROGRAM 搞混淆,...

  • CGINCLUDE 关键字的作用

    这是 以前文章 改用markdown重新排版了一下,看起来合理多了。以下是原文: 在shader代码里经常会看到有...

  • 09-第九章 作用域 js预解析 闭包

    一、作用域 top 和 left 在全局作用域是关键字,在函数作用域不是关键字 作用域:脚本的有效范围,作用范围...

  • iOS9 新特性(20180325)

    1.关键字 关键字:可以用于属性,方法返回值和参数中 关键字的作用:提示作用,告诉开发者属性信息 关键字好处:提高...

  • ES6新特性

    块作用域 let和const有关let 关键字(只在{}作用域内有用)const 关键字(常量也用于块即作用符 ...

  • const在C语言上的定义和用法

    我们经常可以在函数接口参数位置看到有const关键字,但是这个关键字到底有什么作用呢?其实const关键字的作用主...

  • Javascript教程(八)变量作用域

    Javascript用关键字 var 声明的变量有函数作用域和全局作用域两种Javascript用关键字 let...

  • Java 面试常问的关键字总结

    关键字: final finalize finally throws和throw static关键字的作用 abs...

  • iOS 关键字

    关键字可用于属性、方法参数和返回值参数中关键字作用:提示作用,告诉开发者属性信息关键字好处:提高代码规划,减少沟通...

  • JS 手写 new

    new 关键字作用 众所周知,js 中 new 关键字的作用就是创建一个构造函数的实例对象 如以下构造函数,使用 ...

网友评论

      本文标题:CGINCLUDE 关键字的作用

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