包含文件:是类似于C++中头文件的一种文件,后缀是.cginc。
CGPROGRAM
//...
#include "UnityCG.cginc"
//...
ENDCG
UnityCG.cginc是我们最常接触的一个包含文件。
UnityCG.cginc常用的结构体有
//可用于顶点着色器的输入
//顶点位置、顶点法线、第一组纹理坐标
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
//可用于顶点着色器的输入
//顶点位置、顶点切线、顶点法线、第一组纹理坐标
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
//可用于顶点着色器的输入
//顶点位置、顶点切线、顶点法线、四组(或更多)纹理坐标
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
};
除了结构体外,UnityCG.cginc也提供了一些常用的帮助函数
// Computes world space view direction, from object space position
// *Legacy* Please use UnityWorldSpaceViewDir instead
inline float3 WorldSpaceViewDir( in float4 localPos )
{
float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;
return UnityWorldSpaceViewDir(worldPos);
}
// Computes object space view direction
inline float3 ObjSpaceViewDir( in float4 v )
{
float3 objSpaceCameraPos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos.xyz, 1)).xyz;
return objSpaceCameraPos - v.xyz;
}