unityshader中经常见到CGPROGRAM,除此之外还有一个CGINCLUDE关键字。 二个关键字都是用ENDCG来结束,但是用法完全不一样。

CGINCLUDE和ENDCG内可以插入一些shader代码,unity会把插入的这些代码插入到每一个pass中。这等于我们只在CGINCLUDE和ENDCG中写一次就可以在多个Pass里复用这些代码。

  如果多个Pass中顶点着色器和片元着色器计算的公式之类的都是一样的,只有渲染状态不一样,比如透明度混合的混合参数不同等,此时我们完全可以把多个Pass里重复的顶点计算和

片元计算写在CGINCLUDE和ENDCG内,复用这部分代码。下面放一个示例shader:

Shader "CGINCLUDEExample" {
  Properties {
    _Color ("Color", Color) = (1,1,1,1)
  }

CGINCLUDE
  #include "UnityCG.cginc"

  struct appdata_shaded {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
  };

  struct v2f_shaded {
    float4 vertex : SV_POSITION;
    float fresnelValue : TEXCOORD0;
  };

  v2f_shaded vert_shaded (appdata_shaded v) {
    v2f_shaded o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
    o.fresnelValue = lerp(0.39, 0.66, saturate(dot(v.normal, viewDir)));
    return o;
  }

  fixed4 _Color;

  fixed4 frag_shaded (v2f_shaded i) : SV_Target {
    return _Color * i.fresnelValue;
  }

ENDCG

  SubShader {    

    //Pass 1 : Shaded solid
    Pass {
      Blend One Zero
      ZWrite On
      ZTest On

      CGPROGRAM
        #pragma vertex vert_shaded
        #pragma fragment frag_shaded
      ENDCG
    }

    //Pass 2 : Shaded transparent
    Pass {
      Blend SrcAlpha OneMinusSrcAlpha
      ZWrite Off
      ZTest On

      CGPROGRAM
        #pragma vertex vert_shaded
        #pragma fragment frag_shaded
      ENDCG
    }
  }
}

在这个shader里,2个Pass都用了透明度混合,不过混合的参数不一样,但是顶点计算和片元计算都一样,所以把顶点函数vert_shaded和片元函数frag_shaded复用,写到CGINCLUDE和ENDCG里面。

这样就等于在Pass1和Pass2中都声明了顶点函数vert_shaded和片元函数frag_shaded。代码看起来简洁许多,复用代码也能使得我们减少手误敲错代码的几率,shader有改动时也只需改动一处即可。

  

unityShader CGINCLUDE关键字的更多相关文章

  1. 作为一个新手的Oracle(DBA)学习笔记【转】

    一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...

  2. UnityShader学习笔记- Stencil Buffer

    模板测试(Stencil Test)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(Stencil Buffer),模板缓冲可以用来制作物体的遮罩.轮廓描边.阴影.遮挡显示等等效果 目录 Stenc ...

  3. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  4. java面向对象中的关键字

    1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...

  5. 关于javascript中的this关键字

    this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...

  6. transient关键字的用法

    本篇博客转自 一直在路上 Java transient关键字使用小记 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java ...

  7. Java关键字:static

    通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...

  8. Core Java 总结(关键字,特性问题)

    2016-10-19 说说&和&&的区别 初级问题,但是还是加入了笔记,因为得满分不容易. &和&&都可以用作逻辑与的运算(两边是boolean类型), ...

  9. Net中的常见的关键字

    Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...

随机推荐

  1. Intent的那些事儿

    请原谅我用这么文艺的标题来阐释一颗无时无刻奔腾着的2B青年的心.可是今天要介绍的Intent绝不2B,甚至在我看来,或许还有些许飘逸的味道,至于飘逸在哪里呢?那我们就好好来剖析剖析Intent和它的好 ...

  2. 04 - JavaSE之异常处理

    异常的概念(运行期出现的错误) java 异常是 java 提供的用于处理程序中错误的一种机制. 所谓的错误是指在程序运行的过程中发生的一些异常事件.(如:除0溢出,数组下标越界,所要读取的文件不存在 ...

  3. VIM学习网址和资料收集

     摘要:这篇博客主要收集一些学习VIM的好网址和资料 娄老师的一篇VIM 原文地址:http://www.cnblogs.com/rocedu/p/6012444.html Github上VIM的学习 ...

  4. PTA (Advanced Level) 1005 Spell It Right

    Spell It Right Given a non-negative integer N, your task is to compute the sum of all the digits of  ...

  5. tomcat之日志切割

    日志分割 场景:日志量比较大,且研发程序没有设置分卷 1.配置样例: 文件路径:/etc/logrotate.d/tomcat /data/logs/catalina.out { daily comp ...

  6. Spring Boot(三):Spring Boot 中 Redis 的使用

    Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化. Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储.相比 Memcached,Redis 支持更 ...

  7. Jquery插件的使用及制作插件

    常用插件 插件:jquery不可能包含所有的功能,我们可以通过插件扩展jquery的功能. jQuery有着丰富的插件,使用这些插件能给jQuery提供一些额外的功能. jquery.color.js ...

  8. REST风格的应用程序实现

    莫笑我老土,因为我确实是最近才听说REST风格的,以前就是觉得 /category/product/pid 这样的地址非常的漂亮,但是那只是表象罢了,了解深入以后,发现必须有一个客户端的Ajax En ...

  9. 浙大月赛ZOJ Monthly, August 2014

    Abs Problem Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Alice and Bob is playing a ga ...

  10. 漫画 | Spring AOP

    上期,我们看到有小伙伴留言说希望讲讲AOP 然后...... 别激动,来得及 什么是AOP AOP是Spring 框架的一个关键组件,全称为Aspect-OrientedProgramming(面向切 ...