UnityShader进阶小知识点(持续更新)

1、关于在文件中的 “#ifndef、#define、#endif”
这三个关键字是配套使用的,用于防止 头文件被重复引用
举例: 存在a.h文件#include "c.h"而此时b.cpp文件导入了 #include "a.h"和#include "c.h"此时就会造成c.h重复引用。
用法:

#ifndef GRASS_CONFIG
#define GRASS_CONFIG
.
.
.
.
#endif

**文件重复引用的危害:**编译量变多;文件中定义的全局变量会引起运行错误

2、文件中用于判断常量是否定义
关键字: “#if defined/#ifndef……#endif”,表示如果定义/未定义……
用法:

//如果a被定义了;解除a定义;重新定义a为200;
#if defined a 
#undef a 
#define a 200 
#endif 

//如果定义了UNITY_PASS_SHADOWCASTER;定义SHADOWPASS
#if defined(UNITY_PASS_SHADOWCASTER)
	#define SHADOWPASS
#endif

//如果a没有被定义;定义a为200
#ifndef a     
#define a 100 
#endif 

//如果未定义SIMPLE_GRASS;定义GRASS_TEXTURE_ATLAS
#if  !defined(SIMPLE_GRASS)
	#define GRASS_TEXTURE_ATLAS
#endif

3、文件中的“#ifdef…#endif”
作用: 和#if defined…#endif 效果差不多
“#ifdef…#endif” 和 “#if defined…#endif” 的区别: #ifdef 和 #if defined 效果是一样的,但是#if defined可以组成复杂的预编译条件
用法:

//#ifdef...#endif
#ifdef  XXX
   ....
#else
   ....
#endif


//#if defined...#endif
#if defined xxx1
   ....
#elif defined xxx2
   ....
#elif defined xxx3
   ....
#endif


//#ifdef特殊用法,多个嵌套最后多个#endif
#ifdef GRASS_DISPLACEMENT
sampler2D _Displacement;

#ifdef GRASS_RENDERTEXTURE_DISPLACEMENT
sampler2D _GrassRenderTextureDisplacement;

float4 _GrassRenderTextureArea;
#endif
#endif

4、文件中的 “inline”
作用: 为了增加性能,减少频繁调用函数对栈内存重复开辟所带来的消耗
注意: inline 的使用是有所限制的,inline 只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如 while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。
inline的详细说明请看菜鸟教程

你可能感兴趣的:(UnityShader,Unity开发,unity3d,shader)