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等等.有很多的,在这里就介绍大家常见的,并且有 ...
随机推荐
- Android Studio常用设置
Android Studio显示行号 File-->Setting(Ctrl+Alt+S),选择Editor-->General-->Appearance,右侧勾选Show lin ...
- JavaScript -- Navigator
-----040-Navigator.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=&qu ...
- postgreSql 常用查询总结
1. 日期格式转化(参考) select beg_time, end_time, extract(epoch from to_timestamp(end_time,'yyyy-mm-dd-HH24-M ...
- FFmpeg简易播放器的实现-音视频播放
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- Linux入门练习2
export命令用来设置环境变量. 使用单引号时,变量不会被扩展,将依照原样显示.示例: 如果变量未定义过,则什么都不打印: 获得变量值长度 识别当前所使用得shell: 检查是否为超级用户: UID ...
- Rectangles(第七届ACM省赛原题+最长上升子序列)
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1255 描述 Given N (4 <= N <= 100) rec ...
- Spring Security认证配置(一)
学习本章之前,可以先了解下上篇 Spring Security基本配置. 本篇主要讲述Spring Security基于表单,自定义用户认证配置(上篇中的配置,本篇将不再阐述).一共分为三步: 1.处 ...
- SQL SERVER 查看SQL语句IO,时间,索引消耗
1.查看SQL语句IO消耗 set statistics io on select * from dbo.jx_order where order_time>'2011-04-12 12 ...
- 使用Hibernate Validator来帮你做数据校验
数据校验是贯穿所有应用程序层(从表示层到持久层)的常见任务.通常在每个层中实现相同的验证逻辑,这是耗时且容易出错的.这里我们可以使用Hibernate Validator来帮助我处理这项任务.对此,H ...
- 【公众号转载】超详细 Nginx 极简教程,傻瓜一看也会!
什么是Nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Proxy ...