Unity Shader — UnityCG.cginc介绍


UnityCG.cginc是Unity内置的Shader包含文件,它是Unity中代码量最多,文件最大的包含文件。
UnityCG.cginc中声明了很多内置的辅助函数和数据结构体,可避免大量重复编码工作。

一、顶点着色器输入结构体

Unity在包含文件中声明了大量的结构,其中UnityCG.cginc文件包含的结构体如下:

//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
};

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

对所有结构体可归纳包含信息如下:
在这里插入图片描述

二、顶点变换函数

顶点变换函数详细汇总,如下:

函 数说 明
float4 UnityObjectToClipPos(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 UnityViewtToClipPos(float3 pos)将顶点从摄像机空间变换到齐次裁切空间,等同于 mul(UNITY_MATRIX_P,float4(pos,1.0))

三、向量变换函数

函 数说 明
float3 UnityObjectToWorldDir(float3 v)将向量从模型空间转换到世界空间,已经标准化
float3 UnityWorldToObjectDir(float3 v)将向量从世界空间转换到模型空间,已经标准化
float3 UnityObjectToWorldNormal(float3 v)将法线从模型空间转换到世界空间,已经标准化

四、灯光辅助函数

UnityCG.cginc中定义一些计算顶点指向灯光的方向向量,常用的函数汇总如下(以下函数只适用于前向渲染路径(ForwardBase或ForwardAdd Pass类型)):

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

五、视角向量函数

计算顶点指向摄像机的方向向量,也称为视角向量,常用函数如下:

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

六、其他辅助函数和宏

函 数说 明
TRANSFORM_TEX(tex,name)宏定义,输入UV坐标和纹理名称,得到贴图的纹理坐标
fixed3 UnpackNormal(fixed packedNormal)将法线向量从[0,1]映射到[-1,1]
half Luminance(half3 rgb)将颜色数据转化为灰度数据
float4 ComputeScreenPos(float4 pos)输入裁切空间顶点坐标,得到屏幕空间纹理坐标,用于屏幕空间纹理映射
float4 ComputeGrabScreenPos(float4 pos)输入裁切空间顶点坐标,得到采样GrabPass的纹理坐标

七、宏的介绍

宏在使用之前需要先定义,通过一个标识符代替一个字符串。在使用时候只需要输入识别符即可,编译的时候Unity会自动将识别符替换为字符串,因此可以将宏简单理解为字符串的替换。

宏的语法结构为:

# define name string; 
  • #define:表示宏定义的指令;
  • name:宏名称,后续可以直接输入名称进行使用;
  • string:编译的时候要把宏名称替换成的内容,可以是数字,表达式,函数等
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值