Unity Shader——CGInclude文件cginc

1 概述

CGInclude文件,后缀为.cginc的文件,顾名思义就是CG的包含文件,有点类似于C/C++的头文件,我们可以将常用的一些宏、结构体、全局变量、帮助函数等写在CGInclude文件中,以便高效复用。

2 Unity的CGInclude文件

Unity自己也有很多CGInclude文件,位于安装目录的Editor/Data/CGIncludes目录(Windows版),如下所示。我们自己在写shader的时候就经常会用到Unity的这些CG包含文件,比如UnityCG.cginc中定义的各种结构体,Lighting.cginc中的各种光照模型等。
在这里插入图片描述

3 编写我们自己的CGInclude文件

标准的CGInlcude文件结构如下:
MyCG.cginc

#ifndef XXX
#define XXX

//这里定义常用的宏、结构体、全局变量、帮助函数等

e.g.

#ifndef MY_CG_INCLUDE
#define MY_CG_INCLUDE

……

#endif

使用#ifndef、#define、#endif是为了避免重复定义,因为可能在多处进行#include "MyCG.cginc"操作,如果没有这个判断就会出现重复定义,#ifndef XXX就是指如果定义没有XXX,才执行接下来的代码,否则直接跳过

inline内联函数

我们在Unity的内置CGInclude文件中可以发现不少函数都有inline关键字,有inline修饰的函数为内联函数,可以解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,但inline 的使用是有所限制的,inline 只适合函数体内代码简单的函数且会被频繁调用时使用,不能包含复杂的结构控制语句例如 while、switch,并且内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

4 使用我们自己的CGInclude文件

包含CGInclude文件
如果使用的shader和CGInclude文件在同一个目录,则可以直接包含
.shader

CGPROGRAM

#include "MyCG.cginc"

ENDCG

如果不在一个目录,则需要加上相对路径,比如CGInclude文件在shader文件的上一级目录中,则为
#include “…/MyCG.cginc” (CSDN有bug,这里我编辑只用了两个点,显示出来有三个点,以下类似)
这里的 “…/“表示上一级目录,两级目录,则用”…/…/”,以此类推
如果在shader文件的目录下的CGInclude文件夹中,则为
#include “CGInclude/MyCG.cginc”

使用注意点

包含CGInclude文件后,我们就可以直接使用文件内的各种宏、结构体、变量、帮助函数等了。
但是有一点要特别注意的是,如果我们在CGInclude定义了一些需要外部赋值的变量,我们要记得在shader中进行赋值或者声明为Property赋值

参考

《使用CgInclude让你的Shader模块化——Unity内置的CgInclude文件》
https://blog.csdn.net/candycat1992/article/details/38780387
《使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型》
https://blog.csdn.net/candycat1992/article/details/38920347
《使用CgInclude让你的Shader模块化——使用#define指令创建Shader》
https://blog.csdn.net/candycat1992/article/details/38961411

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值