包含文件(include file)是类似于C++中头文件的一种文件,在Unity中,这种包含文件的后缀名是.cginc,我们可以通过创建包含文件来保存我们的自定义函数,这样可以非常有利于我们的代码管理,同时,Unity也提供了很多内置的包含文件,了解这些文件中常用的函数对我们编写shader是非常有必要的。
1. 自定义cginc文件
在编写Shader时,我们可以使用#include指令来引入cginc文件。在Unity编辑器里无法直接创建这些文件,只能通过资源管理器打开我们存放Shader的文件夹,手动创建一个后缀名为.cginc的文件,最好是再创建一个文件夹专门存放这些cginc文件,方便管理。
我在Shader文件夹中,创建了一个名为MyCginc的文件夹,里面存放了我自己写的MyFuncs.cginc文件,该文件内容如下:
void setRedColor(out fixed4 color)
{
color = fixed4(1, 0, 0, 1);
}
void setGreenColor(out fixed4 color)
{
color = fixed4(0, 1, 0, 1);
}
void setBlueColor(out fixed color)
{
color = fixed4(0, 0, 1, 1);
}
然后,我们可在Shader代码中调用这些函数:
#include "MyCginc/MyFuncs.cginc" // 引入自定义cginc文件
float4 vert(float4 v: POSITION): SV_POSITION
{
return UnityObjectToClipPos(v);
}
fixed4 frag(): SV_Target
{
fixed4 color;
setRedColor(color); // 调用自定义cginc文件里的函数
return color;
}
2. 常用的内置cginc文件
这些内置文件都是由Unity提供的,它们都存放在一个名为CGIncludes文件夹里。在Mac上,他们的位置是:/Applications/Unity/Unity.app/Contents/CGIncludes;在Windows上,它们的位置是:Unity安装路径/Editor/Data/CGIncludes。
下表列出了常用的内置文件以及它们的用途:
文件名 | 描述 |
UnityCG.cginc | 包含了最常使用的帮助函数、宏和结构体等 |
UnityShaderVariables.cginc | 在编译Unity Shader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP等 |
Lighting.cginc | 包含了各种内置的光照模型,如果编写的是Surface Shader的话,会自动包含进来 |
HLSLSupport.cginc | 在编译Unity Shader时,会被自动包含进来。声明了很多用于跨平台编译的宏和定义 |
3. 常用的内置结构体
名称 | 描述 | 包含的变量 |
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标 |
appdata_img | 可用于顶点着色器的输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器的输出 | 裁剪空间中的位置、纹理坐标 |
4. 常用的内置函数
函数名 | 描述 |
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于向前渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于向前渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有被归一化 |
float3 UnityObjectToWorlNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(float3 dir) | 把方向矢量从模型空间变换到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间变换到模型空间中 |
5. 常用的全局变量
_Time | float4 | x | 自游戏开始以来经过的总秒数(不包括暂停时间) |
y | 它在每一帧中从0平滑过渡到1,然后再回到0 | ||
z | 自游戏启动以来经过的帧数 | ||
w | 自游戏启动以来经过的固定(FixedUpdate)帧数 | ||
UNITY_LIGHTMODEL_AMBIENT | fixed4 | 环境光照颜色(梯度环境情况下的天空颜色)。旧版变量 | |
_WorldSpaceLightPos0 | float3 | 当前平行光的方向,方向是从光源到照射的方向 |
_LightColor0 | fixed3 | 环境光照颜色 |