unityShader CGINCLUDE关键字
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关键字的更多相关文章
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
- UnityShader学习笔记- Stencil Buffer
模板测试(Stencil Test)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(Stencil Buffer),模板缓冲可以用来制作物体的遮罩.轮廓描边.阴影.遮挡显示等等效果 目录 Stenc ...
- JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
- java面向对象中的关键字
1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
- transient关键字的用法
本篇博客转自 一直在路上 Java transient关键字使用小记 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java ...
- Java关键字:static
通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...
- Core Java 总结(关键字,特性问题)
2016-10-19 说说&和&&的区别 初级问题,但是还是加入了笔记,因为得满分不容易. &和&&都可以用作逻辑与的运算(两边是boolean类型), ...
- Net中的常见的关键字
Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...
随机推荐
- Bash数组
1. 数组申明 declare -a array 2. 数组赋值 #法1 array=(var1 var2 var3 ... varN) #法2 array=([]=var1 []=var2 []=v ...
- tomcat8 进入不了Manager App 界面 403 Access Denied
准备 1.注释掉context.xml中的value属性 使用下面的命令: vim /usr/local/tomcats/tomcat-daily/webapps/manager/META-INF/c ...
- PHP之高性能I/O框架:Libevent(二)
Event扩展 Event可以认为是替代libevent最好的扩展,因为libevent已经很久不更新了,而Event一直在更新,而且Event支持更多特性,使用起来也比libevent简单. Eve ...
- Linux 上SSH 服务的配置和管理
0.前期准备:清空防火墙,关闭SELinux. [root@localhost ~]# iptables -F #清空防火墙 [root@localhost ~]# /etc/init.d/iptab ...
- php里input数组的应用
一般我们使用input传递表单数据时,可以使用<input name="xxx[]" value="1"><input name=" ...
- new Thread与线程创建
概要:new Thread 并不意味着已经创建了一个线程,只能说明创建一个类的对象实例而已.而真正创建线程的是start()方法,此方法将调用本地方法start0()创建本地线程,而Thread的ru ...
- 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致
打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...
- windows环境下搭建Java开发环境(二):Tomcat安装和配置
一.资源下载 官网:http://tomcat.apache.org/ 本人安装的是Tomcat8.5,安装包百度云资源:链接:https://pan.baidu.com/s/17SDFsoS0yAP ...
- elasticSearch6源码分析(7)node
1.node概述 Any time that you start an instance of Elasticsearch, you are starting a node. A collection ...
- ResNet 论文研读笔记
Deep Residual Learning for Image Recognition 原文链接 摘要 深度神经网络很难去训练,本文提出了一个残差学习框架来简化那些非常深的网络的训练,该框架使得层能 ...