【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型
本系列主要參考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同一时候会加上一点个人理解或拓展。
这里是本书全部的插图。
========================================== 切割线 ==========================================
写在前面
了解内置的CgInclude文件当然非常好,可是假设我们想要创建自己的CgInclude文件来存储光照模型和辅助函数又该怎么办呢?
好消息是我们的确能够创建自己的CgInclude文件。坏消息是我们须要再了解一点代码语法。好啦,那就開始吧!
准备工作
好消息是这次的准备工作最终有点不同了。。
。坏消息是我不能再复制粘贴了。
。
。
- 首先,创建一个新的文本文件,比如MyCgInclude.txt。
- 然后。把文件后缀改为.cginc。
当然,操作系统通常会给你一些警示信息。说这个文件将变得不可用,但相信我,我们这个是可用的。
- 将新的.cginc文件导入到我们的Unity项目中(注意,在我的项目里,它的位置在一个新的名为CgIncludes的目录下)。等编译完毕后,我们能够看到Unity把该文件当成一个CgInclude文件编译好了。像以下这样:
实现
- 首先,使用以下的预处理指令開始我们的CgInclude文件。
这些声明和#pragma、#include相似,在这里,我们想要去定义一个新的代码集合,仅仅要我们的Surface Shader在它的编译指令里面包括了这个文件,这些代码就能够运行了。在CgInclude文件的最開始键入例如以下代码:
#ifndef MY_CG_INCLUDE
#define MY_CG_INCLUDE - 然后。我们必须确保#ifndef或者#ifdef要有一个#endif来结束定义检查。
就和一个if语句须要两个花括号一样。
在#define指令以下键入例如以下代码:
#endif
- 接下来,我们就能够填充剩余部分了。键入例如以下代码:
// Custom Build-in Variables
fixed4 _MyColor; // Lighting models
inline fixed4 LightingHalfLambert (SurfaceOutput s, fixed3 lightDir, fixed atten) {
fixed diff = max (0, dot (s.Normal, lightDir)); diff = (diff + 0.5) * 0.5; fixed4 c;
c.rgb = s.Albedo * _LightColor0.rgb * ((diff * _MyColor.rgb) * atten * 2);
c.a = s.Alpha;
return c;
} - 以下是完整的MyCgInlcude.cginc文件:
#ifndef MY_CG_INCLUDE
#define MY_CG_INCLUDE // Custom Build-in Variables
fixed4 _MyColor; // Lighting models
inline fixed4 LightingHalfLambert (SurfaceOutput s, fixed3 lightDir, fixed atten) {
fixed diff = max (0, dot (s.Normal, lightDir)); diff = (diff + 0.5) * 0.5; fixed4 c;
c.rgb = s.Albedo * _LightColor0.rgb * ((diff * _MyColor.rgb) * atten * 2);
c.a = s.Alpha;
return c;
} #endif上面相当于一个头文件,但想要完整利用它还须要一些其它的步骤。
我们须要告诉当前的Shader。我们想要使用自己的文件和代码。
- 返回上一节所用的Shader。
我们须要在块中包括我们自己的CgInclude文件,就像C++中须要在开头加入头文件引用一样。
同一时候,之前我们的Shader使用内置的Lambert光照模型,但如今我们想要使用自己定义的Half Lambert光照模型。
由于我们已经包括了该CgInclude文件,我们能够直接在#pragma指令中指明这一模型:
CGPROGRAM
#include "../CgIncludes/MyCgInclude.cginc"
#pragma surface surf HalfLambert解释:这里须要指明.cginc文件的相对与该Shader的路径。
也就是说。假设它和Shader放在同一个目录下,那么直接写名称就可以。
但在我的项目中,Shader放在了Shaders目录下,而.cginc放在了CgIncludes目录下。因此须要上述写法。
- 最后,还记得我们在CgInclude文件里声明了一个_MyColor变量吗?我们还须要在Shader的Properties中加入该属性:
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_DesatValue ("Desaturate", Range(0, 1)) = 0.5
_MyColor ("My Color", Color) = (1, 1, 1, 1)
}
解释
也就是指。我们使用#ifndef指令和#ifndef指令的地方。
当我们声明#ifndef指令时,我们就是在告诉Unity,假设未定义这个名字,那么就使用这个名字去定义一些东西!
在本节中。我们是想要去#define MY_CG_INCLUDE。
因此,假设Unity没有找到一个名为MY_CG_INCLUDE的定义,它就会在编译该CgInclude文件时创建它。而#endif就是告诉Unity,这是该定义在这里结束啦。以下的不用再找啦。
其它优点,像灵活性等。你能够联想C++头文件来得出啦~
【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型的更多相关文章
- 【Unity Shaders】使用CgInclude让你的Shader模块化——Unity内置的CgInclude文件
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- 【Unity Shaders】使用CgInclude让你的Shader模块化——使用#define指令创建Shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Transparency —— 透明的cutoff shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Diffuse Shading——在Surface Shader中使用properties
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Diffuse Shading——向Surface Shader添加properties
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Reflecting Your World —— 在Unity3D中创建一个简单的动态Cubemap系统
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Reflecting Your World —— 在Unity3D中创建Cubemaps
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图.这里是本书所需的代码和 ...
- 【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
随机推荐
- ***PHP各种编码的汉字字符串截取
虽然PHP有现成的截取字符串函数substr(),但是这个函数不能对汉字字符串进行截取,要实现这种效果还需要我们自己去编写相应的函数.汉字有多种编码,比如GB2312,UTF-8等,汉字字符串的截取需 ...
- php抓取页面的几种方法详解
本篇文章是对php抓取页面的几种方法进行了详细的分析介绍,需要的朋友参考下 在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求 ...
- 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问 已重装office2 ...
- 165. Compare Version Numbers
题目: Compare two version numbers version1 and version2.If version1 > version2 return 1, if version ...
- python还不能作为主要编程语言的原因:
1.不太熟悉,容易犯新手错误,2.调试方法不同3.写了一个函数,是否语法正确,不能知道,只有具体调用它的时候才知道4.编辑器太业余,没有输入联想功能5.要查找一个函数或变量在哪里定义的,只能通过搜索的 ...
- WCF - Self Hosting
WCF - Self Hosting Here, the WCF service is hosted in a console application. Given below is the proc ...
- MySQL事务之数据结构
事务是关系型数据库的核心,贯穿整个源代码,先来瞅瞅相关的数据结构,揭开面纱: server层和innodb引擎层分别对应了不同的数据结构,但相互关联: server层需要引擎注册事务,以便server ...
- BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...
- Linux kernel ‘uio_mmap_physical’函数缓冲区溢出漏洞
漏洞名称: Linux kernel ‘uio_mmap_physical’函数缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-154 发布时间: 2013-11-13 更新时间: 201 ...
- 在SQL2005实现维护计划-备份数据库
一.備份數據庫維護計劃方案 [注]: 1.先啟動SQL Server Agent服務 2..交易記錄備份 (只限於完整和大量記錄復原模式). 3.下面中”清除備份trn文件” & “清除備份日 ...