Unity的包含文件

一、包含文件的使用语法

包含文件是以cginc作为拓展名的文本文件。

Windows系统,Unity所有包含文件存放在安装目录\Editor\Data\CGIncludes\下;Mac系统,包含文件存在Applications\Unit\Unity.app\Contents\CGIncludes\下。

使用方法:

1
2
3
4
5
6
7
{
CGPROGRAM
//...
#include “UnityCG.cginc"
//...
ENDCG
}

二、UnityCG.cginc

1.顶点着色器输入结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//appdata基础结构体
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};

//appdata切向量结构体
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};

//appdata完整结构体
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};

//appdata图像特效结构体
struct appdata_img
{
float4 vertex : POSITION;
half2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};

//v2f图像特效结构体
struct v2f_img
{
float4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};

每个结构体最后一行为宏,可以暂时不管。

包含文件中可以使用的内置结构体
结构体 包含信息
appdata_base 顶点坐标、顶点法线和第一套UV坐标
appdata_tan 顶点坐标、切向量、顶点法线和第一套UV坐标
appdata_fulle 顶点坐标、切向量、顶点法线、第一至第四套UV坐标和顶点对应颜色
appdata_img 顶点坐标、第一套UV坐标
v2f_img 裁切空间顶点坐标、纹理坐标

2.顶点变换函数

顶点变换相关的函数
函数 说明
float4 UnityObjectToClips(float3 pos) 将顶点从模型空间变换到齐次裁切空间,等同于mul(UNITY_MATRIX_MVP,float4(pos,1,0))
float3 UnityObjectToViewPos(float3 pos) 将顶点从模型空间转换到摄像机空间,等同于mul(UNITY_MATRIX_MV,float4(pos,1,0)).xyz。当输入为float4类型,Unity会自动重载为float3类型
float3 UnityWorldToViewPos(float3 pos) 将顶点从世界空间变换到摄像机空间,等同与mul(UNITY_MATRIX_V,float4(pos,1,0)).xyz
float4 UnityWorldToClipPos(float3 pos) 将顶点从世界空间变换到齐次裁切空间,等同mul(UNITY_MATRIX_VP,float4(pos,1,0))
float4 UnityViewToClipPos(float3 pos) 将顶点从摄像机空间变换到摄像机空间,等同mul(UNITY_MATRIX_P,float4(pos,1,0)).xyz

3.向量变换函数

向量变换相关的函数
函数 说明
float3 UnityObjectToWorldDir(float3 dir) 将向量从模型空间转换到世界空间,已经标准化处理
float3 UnityWorldToObjectDir(float3 dir) 将向量从世界空间转换到模型空间,已经标准化处理
float3 UnityObjectToWorldNormal(float3 norm) 将法线从模型空间转换到世界空间,已经标准化处理

4.灯光辅助函数

以下函数仅适用于前向渲染路径(ForwardBase或ForwardAdd Pass类型)。

灯光相关的函数
函数 说明
float3 WorldSpaceLightDir(in float4 localPos) 输入模型空间顶点坐标,返回世界空间中从顶点指向灯光的向量,没有被标准化
float3 UnityWorldSpaceLightDir(in float3 worldPos) 输入世界空间顶点坐标,返回世界空间从顶点指向灯光的向量,没有被标准化
float3 ObjSpaceLightDir(in float4 v) 输入模型空间顶点坐标,返回模型空间中从顶点指向灯光的向量,没有被标准化
float3 Shade4PointLights(...) 输入一系列所需变量,返回4个点光源的光照信息,在前向渲染中使用这个函数计算逐顶点的光照

5.视角向量函数

视角向量相关的函数
函数 说明
float3 WorldSpaceViewDir(float4 v) 输入模型空间顶点,返回世界空间中从顶点指向摄像机的向量,没有被标准化
float3 UnityWorldSpaceViewDir(float3 v) 输入世界空间中的顶点,返回世界空间中从顶点指向摄像机的向量,没有被标准化
float3 ObjSpaceViewDir(float4 v) 输入模型空间顶点,返回模型空间中从顶点指向摄像机的向量,没有被标准化

三、UnityShaderVariables.cginc

1.空间变换矩阵

空间变换矩阵
矩阵 说明
UNITY_MATRIX_MVP 模型-观察-投影矩阵,用于将顶点/向量从模型空间变换到裁剪空间
UNITY_MATRIX_MV 模型-观察矩阵,用于将顶点/向量从模型空间变换到摄像机空间
UNITY_MATRIX_V 观察矩阵,用于将顶点/向量从世界空间变换到摄像机空间
UNITY_MATRIX_P 投影矩阵,用于将顶点/向量从摄像机空间变换到裁剪空间
UNITY_MATRIX_VP 观察-投影矩阵,用于将顶点/向量从世界空间变换到裁剪空间
UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵
unity_ObjectToWorld 模型矩阵,用于将顶点/向量从模型空间变换到世界空间
unity_WorldToObject _Object2World的逆矩阵,用于将顶点/向量从世界空间变换到模型空间

2.时间变量

时间变量
变量 说明
_Time 关卡从开始到现在所运行的时间,4个分类分别为t/20,t,t*2,t*3
_SinTime 将运行时间(t/8,t/4,t/2,t)输入到正弦函数
_CosTime 将运行时间(t/8,t/4,t/2,t)输入到余弦函数
unity_DeltaTime 每一帧的递增时间,4个分量分别为dt,1/dt,smoothDt,1/smoothDt