1,UnityCG.cginc 常用函数(为了避免跟矩阵混淆,可以以一些结构特点来区分,比如函数一般没有下划线
而矩阵可能会有下划线标示,比如矩阵的unity_…,而函数会是Unity…。)
函数 | 说明 |
---|---|
float3 WorldSpaceViewDir(float4 v) | 输入一个模型空间的顶点位置,返回世界空间中从该点到摄像机的观察 方向。内部实现使用了 UnityWorldSpaceViewDir函数 |
float3 UnityWorldSpaceViewDir(float4 v) | 输入一个世界空间的顶点位置,返回世界空间中从该点到摄像机的观察方向 可以在UnityCG.cginc查看其代码计算 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向 |
UnityObjectToClipPos(v.vertex) | 这个函数是将模型空间顶点转换到裁剪空间函数:应用举例:o.pos = UnityObjectToClipPos(v.vertex) |
float3 ObjSpaceLightDir(float4 v) | 仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置, 返回模型空间中从该点到光源的光照方向,没有被归一化 |
float3 WorldSpaceLightDir(float4 v) | 仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回世界 空间中从该点到光源的光照方向,没有被归一化 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅可用于前向渲染中,输入一个世界空间的顶点位置,返回世界空间从该点到 光源的光照方向,没有被归一化 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(float3 dir) | 把方向矢量从模型空间转换到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间转换到模型空间中 |
float3 Shade4PointLights(…) | 仅可用于前向渲染中,计算四个点光源的光照,它的参数是已经打包进矢量的 光照数据。前向渲染通常会使用这个函数来计算逐顶点光照 |
2,内置的一些变量
变量 | 说明 |
---|---|
UNITY_LIGHTMODEL_AMBIENT | 是Unity自带的宏定义常量,目的获取环境光。 应用举例: float3 ambientLighting = float3(UNITY_LIGHTMODEL_AMBIENT) * float3(_Color) |
_WorldSpaceLightPos0 | 获得世界空间灯光位置 fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);求光源方向还有中写法是用上面的UnityWorldSpaceLightDir(float4 v),这是Unity5新添加的内置函数。这个变量一般在Forward渲染路径下使用,存储的是重要的pixel光源,没错,的确是使用w来判断这个光源的类型的,一般和_LightColor0配合使用 |
_WorldSpaceCameraPos | 过这个可以获得世界空间的摄像机位置fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz); |
3.Unity内置的变换矩阵
矩阵名 | 说明 |
---|---|
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_MATRIX_MV的逆矩阵 |
unity_ObjectToWorld(_Object2World) | 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间 |
unity_WorldToObject(_World2Object) | 用于将顶点/方向矢量从世界空间转换到模型空间。应用举例:o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; |
4.摄像机和屏幕参数
类型 | 变量名 | 描述 |
---|---|---|
_WorldSpaceCameraPos | float3 | 该摄像机在世界空间中的位置 |
_ProjectionParams | float4 | x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面到摄像机的距离 |
_ScreenParams | float4 | x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度 |
_ZBufferParams | float4 | x=1-Far/Near,y=Far/Near,z=x/Far,w=y/Far,该变量用于线性化Z缓存中的深度值 |
unity_OrthoParams | float4 | x=width,y=height,z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交投影摄像机的宽度和高度 |
unity_CameraProjection | float4x4 | 该摄像机的投影矩阵 |
unity_CameraInvProjection | float4x4 | 该摄像机的投影矩阵的逆矩阵 |
unity_CameraWorldClipPlanes[6] | float4x4 | 该摄像机的6个裁剪平面在世界空间下的等式,按左、右、下、上、近、远裁剪平面 |