如果不了解一些上下文环境,编程是无法如鱼得水的,同样Unity的Shader也有上下文,那么Unity为我们准备了哪些可以直接使用的值和辅助函数呢?

先分析

Unity中的内置内容,是通过包含到Shader程序中的例如:

CGPROGRAM
// ...
#include "UnityCG.cginc"
// ...
ENDCG
Shader包含在Unity中扩展名为.cginc的文件,内置的.cginc有如下文件:
1. HLSLSupport.cginc - (自动包含) 辅助宏 and 定义一些跨平台的编译.
2. UnityShaderVariables.cginc - (自动包含) 非常常用的全局变量.
3. UnityCG.cginc - 非常常用的函数.
4. AutoLight.cginc - 光照 & shadowing functionality等. surface shaders内部使用这个文件.
5. Lighting.cginc - 标准表面着色器光照模型; 在你编写Shader时自动包含.
6. TerrainEngine.cginc - 地形和Vegetation shaders的帮助函数.

这些cginc扩展文件一般存放在以下路径:

Windows:{Unity安装路径}/Data/CGIncludes/UnityCG.cginc 
Mac:/Applications/Unity/Unity.app/Contents/CGIncludes/UnityCG.cginc。
以下就是我们想知道的,内置的变量和函数有哪几个

内置变量

空间转换:Transformations

UNITY_MATRIX_MVP     Current model * view * projection matrix.模型空间到裁剪空间
UNITY_MATRIX_MV      模型变换矩阵 * view矩阵.
UNITY_MATRIX_V       从世界空间到本地视图空间的矩阵.
UNITY_MATRIX_P       从视图空间到投影空间的矩阵.
UNITY_MATRIX_VP      当前视图矩阵 * 投影矩阵.
UNITY_MATRIX_T_MV    转置自 model * view matrix矩阵.
UNITY_MATRIX_IT_MV   逆转置 model * view matrix矩阵.
unity_ObjectToWorld  其实就是UNITY_MATRIX_M矩阵.
unity_WorldToObject  从世界空间到模型空间.

这些矩阵都代表了 几个空间(模型空间,世界空间,视野空间,投影)等转换
转换到裁剪空间:mul(UNITY_MATRIX_MVP, v.vertex)

UNITY_MATRIX_M      模型变换矩阵
UNITY_MATRIX_V      视图变换矩阵
UNITY_MATRIX_P      投影变换矩阵
UNITY_MATRIX_VP     视图投影变换矩阵
UNITY_MATRIX_MV     mul(unity_MatrixV, unity_ObjectToWorld)    模型视图变换
UNITY_MATRIX_MVP    mul(unity_MatrixVP, unity_ObjectToWorld)   模型视图投影变换
UNITY_MATRIX_MV  =  UNITY_MATRIX_M * UNITY_MATRIX_V
UNITY_MATRIX_VP  =  UNITY_MATRIX_V * UNITY_MATRIX_P
UNITY_MATRIX_MVP =  UNITY_MATRIX_M * UNITY_MATRIX_V * UNITY_MATRIX_P

相机和屏幕 Camera and screen

_WorldSpaceCameraPos    float3 世界空间中的相机位置
_ProjectionParams       float4 投影参数:x1.0,y是近平面,z是远平面,w是除以最远距离
_ScreenParams           float4 屏幕参数:x是宽,y是高,略
_ZBufferParams          float4 z线性缓冲区
unity_OrthoParams       float4 x为正交相机宽度, y是正交相机高度。z未使用,w为1.0正交,为0是时是透视
unity_CameraProjection          float4x4 投影矩阵
unity_CameraInvProjection       float4x4 投影矩阵的转置
unity_CameraWorldClipPlanes[6]  float4 世界空间方程,按此顺序:左,右,底,顶,近,远

时间 Time

_Time   float4  (t / 20,t,t * 2,t * 3)达标不同参数值,用作动画
_SinTime    float4  时间的Sine: (t/8, t/4, t/2, t).
_CosTime    float4  时间的Cosine: (t/8, t/4, t/2, t).
unity_DeltaTime float4  时间增量: (dt, 1/dt, smoothDt, 1/smoothDt).

剩下的,可以自己从官网查吧
内置变量


灯光部分 Lighting

_LightColor0 (声明在Lighting.cginc中) fixed4 光照颜色.
_WorldSpaceLightPos0 float4 方向光: (世界空间的方向, 0). 其他光照: (世界空间的位置, 1).
_LightMatrix0 (声明在AutoLight.cginc) float4x4 世界到光的菊展. 用于Cookie & 衰减纹理采样.
unity_4LightPosX0, float4 (ForwardBase)前四个非重要点光源的世界空间位置.
unity_4LightAtten0 float4 (ForwardBase pass only) attenuation factors of first four non-important point lights.
unity_LightColor half4[4] (ForwardBase pass only) colors of of first four non-important point lights.
unity_WorldToShadow float4x4[4] World-to-shadow matrices. One matrix for spot lights, up to four for directional light cascades.

_LightColor float4 Light color.
_LightMatrix0 float4x4 World-to-light matrix. Used to sample cookie & attenuation textures.
unity_WorldToShadow float4x4[4] World-to-shadow matrices. One matrix for spot lights, up to four for directional light cascades.

unity_LightColor half4[8] Light colors.
unity_LightPosition float4[8] View-space light positions. (-direction,0) for directional lights; (position,1) for point/spot lights.
unity_LightAtten half4[8] Light attenuation factors. x is cos(spotAngle/2) or –1 for non-spot lights; y is 1/cos(spotAngle/4) or 1 for non-spot lights; z is quadratic attenuation; w is squared light range.
unity_SpotDirection float4[8] View-space spot light positions; (0,0,1,0) for non-spot lights.

雾和环境 Fog and Ambient

unity_AmbientSky fixed4 Sky ambient lighting color in gradient ambient lighting case.
unity_AmbientEquator fixed4 Equator ambient lighting color in gradient ambient lighting case.
unity_AmbientGround fixed4 Ground ambient lighting color in gradient ambient lighting case.
UNITY_LIGHTMODEL_AMBIENT fixed4 Ambient lighting color (sky color in gradient ambient case). Legacy variable.
unity_FogColor fixed4 Fog color.
unity_FogParams float4 Parameters for fog calculation: (density / sqrt(ln(2)), density / ln(2), –1/(end-start), end/(end-start)). x is useful for Exp2 fog mode, y for Exp mode, z and w for Linear mode.

Various

unity_LODFade float4 Level-of-detail fade when using LODGroup. x is fade (0..1), y is fade quantized to 16 levels, z and w unused.
_TextureSampleAdd float4 Set automatically by Unity for UI
only based on whether the texture being used is in Alpha8 format (the value is set to (1,1,1,0)) or not (the value is set to (0,0,0,0)).



内置辅助函数

包含了
1、顶点变换
2、通用函数
3、正向渲染时的函数
4、屏幕空间函数
5、顶点辅助函数

UnityCG.cginc中的顶点变换

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,应该在它的位置使用。

UnityCG.cginc中的通用助手函数

float3 WorldSpaceViewDir (float4 v) 从给定的对象空间顶点位置向摄像机返回世界空间方向(未标准化)。
float3 ObjSpaceViewDir (float4 v)   从给定的对象空间顶点位置向摄像机返回对象空间方向(未标准化)。
float2 ParallaxOffset (half h, half height, half3 viewDir)  计算视差法线贴图的UV偏移。
fixed Luminance (fixed3 c)  将颜色转换为亮度(灰度)。
fixed3 DecodeLightmap (fixed4 color)    从Unity 光照贴图中解码颜色(RGBM或dLDR,具体取决于平台)。
float4 EncodeFloatRGBA (float v)    编码[0..1]范围浮动为RGBA颜色,用于存储在低精度渲染目标中。
float DecodeFloatRGBA (float4 enc)  将RGBA颜色解码为浮点数。
float2 EncodeFloatRG (float v)  编码[0..1]范围浮动到float2。
float DecodeFloatRG (float2 enc)    解码先前编码的RG浮点数。
float2 EncodeViewNormalStereo (float3 n)    将视图空间正常编码为0..1范围内的两个数字。
float3 DecodeViewNormalStereo (float4 enc4) 从enc4.xy解码视图空间法线。

在UnityCG.cginc中正向渲染辅助函数

这些函数仅在使用正向渲染时有用(ForwardBase或ForwardAdd传递类型)。
float3 WorldSpaceLightDir (float4 v)    给定对象空间顶点位置,计算世界空间方向(未标准化)到光。
float3 ObjSpaceLightDir (float4 v)  给定对象空间顶点位置,计算对象空间方向(未标准化)到光。
float3 Shade4PointLights (...)  计算来自四个点光源的照明,将光数据紧密地打包到矢量中。正向渲染使用它来计算每顶点光照。

UnityCG.cginc中的屏幕空间辅助函数

以下函数是帮助计算用于采样屏幕空间纹理的坐标的辅助函数。它们返回float4到样本纹理的最终坐标可以通过透视分割(例如xy/w)计算。
该功能也照顾的平台差异在渲染纹理的坐标。
float4 ComputeScreenPos (float4 clipPos)    计算用于执行屏幕空间映射纹理样本的纹理坐标。输入是剪辑空间位置。
float4 ComputeGrabScreenPos (float4 clipPos)    计算用于采样GrabPass纹理的纹理坐标。输入是剪辑空间位置。

UnityCG.cginc中的顶点辅助函数

这些函数仅在使用每顶点照明着色器(“顶点”传递类型)时才有用。
float3 ShadeVertexLights (float4 vertex, float3 normal) 在给定物体空间位置和法线的情况下,计算来自四个每顶点光和环境光的照度