Unity内置变换矩阵变量
变量名 | 描述 |
---|---|
UNITY_MATRIX_MVP | 当前的模型-观察-投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间 |
UNITY_MATRIX_MV | 当前的模型-观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间 |
UNITY_MTRIX_V | 当前观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间 |
UNITY_MTRIX_P | 当前的投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间 |
UNITY_MTRIX_VP | 当前的观察-投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间 |
UNITY_MATRIX_T_MV | UNITY_MATRIX_MV的转置矩阵 |
UNITY_MATRIX_IT_MV | UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵 |
_Object2World | 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间 |
_World2Object | _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间 |
相机参数矩阵及一些变量
变量名 | 类型 | 描述 |
---|---|---|
_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_CameraWorldClipPlane[6] | float4 | 该摄像机的6个裁剪平面在世界空间下的等式,按如下顺序:左、右、下、上、近、远裁剪平面 |
ShaderLab属性类型和CG变量类型的关系
ShaderLab属性类型 | CG变量类型 |
---|---|
Color,Vector | float4,half4,fixed4 |
Range,Float | float,half,fixed |
2D | sampler2D |
Cube | samplerCube |
3D | sampler3D |
Unity中一些常用的包含文件
文件名 | 描述 |
---|---|
UnityCG.cginc | 包含了最常使用的帮主函数、宏和结构体 |
UnityShaderVariables.cginc | 在编译Unity.shader时,会被自动包含进来。包含了许多内置的全局变量,如UNITY_MATRIX_MVP等 |
Lightning.cginc | 包含了各种内置的光照类型,如果编写的是Surface Shader的话,会自动包含进来 |
HLSLSupport.cginc | 在编译Unity Shader时,会被自动包含进来声明了很多用于跨平台编译的宏和定义 |
UnityCG.cginc中一些常用的结构体
名称 | 描述 | 包含的变量 |
---|---|---|
appdata_base | 可用于顶点着色器的输入 | 顶点位置、顶点法线、第一组纹理坐标 |
appdata_tan | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、第一组纹理坐标 |
appdata_full | 可用于顶点着色器的输入 | 顶点位置、顶点切线、顶点法线、四(或更多)组纹理坐标 |
appdata_img | 可用于顶点着色器的输入 | 顶点位置、第一组纹理坐标 |
v2f_img | 可用于顶点着色器的输出 | 裁剪空间中的位置、纹理坐标 |
UnityCG.cginc中一些常用的帮助函数
函数名 | 描述 |
---|---|
float3 WorldSpaceViewDir(flooat4 v) | 输入一个模型空间的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
float3 UnityWorldSpaceViewDir(float4 v) | 输入一个世界空间中的顶点位置,返回模型空间中从该店到摄像机的观察方向 |
float3 ObjSpaceViewDir(float4 v) | 输入一个模型空间中的顶点位置,返回模型空间从该点到摄像机的观察方向 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间从该点到光源的光照方向。没有被归一化。 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个世界空间中的顶点位置返回世界空间中从该点到光源的光照方向。没有被归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间从该点到光源的光照方向。没有被归一化。 |
float3 UnityObjectToWorldNormal(float3 norm) | 把法线方向从模型空间转换到世界空间中 |
float3 UnityObjectToWorldDir(in float3 dir) | 把方向矢量从模型空间转换到世界空间中 |
float3 UnityWorldToObjectDir(float3 dir) | 把方向矢量从世界空间变换到模型空间中 |
从应用阶段传递模型数据给顶点着色器时Unity支持的常用语义
语义 | 描述 |
---|---|
POSITION | 模型空间中的顶点位置,通常是float4类型 |
NORMAL | 顶点法线,通常是float3类型 |
TANGENT | 顶点切线,通常是float3类型 |
TEXCOORDn如TEXCOORD0、TEXCOORD1 | 该顶点的纹理坐标,TEXCOORD0是第一组纹理坐标,依此类推。通常是float2或float4类型 |
COLOR | 顶点颜色,通常是fixed4或float4类型 |
从顶点着色器传递给片元着色器时Unity使用的常用语义
语义 | 描述 |
---|---|
SV_POSITION | 裁剪空间中的顶点坐标,结构体必须包含一个用该语义修饰的变量,等同于DirectX9中的POSITION,但最好使用SV_POSITION |
COLOR0 | 通常用于输出第一组顶点颜色,但不是必需的 |
COLOR1 | 通常用于输出第二组顶点颜色,但不是必需的 |
TEXCOORD0~TEXCOORD7 | 通常用于输出顶点纹理坐标,但不是必需的 |
片元着色器输出时Unity支持的常用语义
语义 | 描述 |
---|---|
SV_Target | 输出值将会存储到渲染目标(render target)中。等同于DirectX9中的COLOR语义,但最好使用SV_Traget |
Unity 提前定义的5个渲染队列
名称 | 队列索引号 | 描述 |
---|---|---|
Background | 1000 | 这个渲染队列会在其他队列之前被渲染,我们通常使用该队列来渲染那些需要绘在背景上的物体 |
Geometry | 2000 | 默认的渲染队列,大多数物体都使用这个队列。不透明物体使用这个队列 |
AlphaTest | 2450 | 需要透明度测试的物体使用这个队列。在Unity 5 中它从Geometry队列中被单独分出来,这是因为它在所有不透明物体渲染之后再渲染它们会更加高效 |
Transparent | 3000 | 这个队列的物体会在所有Geometry和AlphaTest物体渲染后,再按从后往前的顺序进行渲染。任何使用了透明度混合(例如关闭了深度写入的Shader)的物体都应该使用该队列 |
Overlay | 4000 | 该队列用于实现一些叠加效果,任何需要在最后渲染的物体都应该使用该队列 |
ShaderLab的Blend命令
语义 | 描述 |
---|---|
Blend Off | 关闭混合 |
Blend SrcFactor DstFactor | 开启混合,并设置混合因子。源颜色(该片元产生的颜色)会乘以SrcFactor,而目标颜色(已经存在与颜色缓存的颜色)会乘以DstFactor,然后把两者相加后再存入颜色缓冲中 |
Blend SrcFactor DstFactor ,SrcFactorA DstFactorA | 和上面几乎一样,只是使用不同的因子来混合透明通道 |
BlendOp BlendOperation | 并非是把源颜色和目标颜色简单相加后混合,而是使用BlendOperation对它们进行其他操作 |
ShaderLab中的混合因子
参数 | 描述 |
---|---|
One | 因子为1 |
Zero | 因子为0 |
SrcColor | 因子为源颜色值。当用于混合RGB的混合等式时,使用SrcColor的RGB分量作为混合因子;当用于混合A通道的混合等式时,使用SrcColor的A分量作为混合因子 |
SrcAlpha | 因子为源颜色的透明度值(A通道) |
DstColor | 因子为目标颜色值。当用于混合RGB的混合等式时,使用DstColor的RGB分量作为混合因子;当用于混合A通道的混合等式时,使用DstColor的A分量作为混合因子 |
DstAlpha | 因子为目标颜色的透明度值(A通道) |
OneMinusSrcColor | 因子为(1-源颜色)。当用于混合RGB的混合等式时,使用结果的RGB分量作为混合因子;当用于混合A通道的混合等式时,使用结果的A分量作为混合因子 |
OneMinusSrcAlpha | 因子为(1-源颜色的透明度值) |
OneMinusDstColor | 因子(1-目标颜色)。当用于混合RGB的混合等式时,使用结果 |
Shader Lab中的混合模式
操作 | 描述 |
---|---|
Add | 将混合后的源颜色和目标颜色相加,默认的混合操作是: Orgb=SrcFactor*Srgb+DstFactor*Drgb Oa=SrcFactorA*Sa+DstFactorA*Da |
Sub | 用混合后的源颜色减去混合后的目标颜色,使用的混合等式是: Orgb=SrcFactor*Srgb-DstFactor*Drgb Oa=SrcFactorA*Sa-DstFactorA*Da |
RevSub | 用混合后的颜色减去混合后的目标颜色。使用的混合等式是: Orgb=DstFactor*Drgb-SrcFactor*Srgb Orgb=DstFactorA*Da-SrcFactorA*Sa |
Min | 使用源颜色和目标颜色中较小的值,是逐分量比较的。使用的混合等式是: Orgba=(min(Sr,Dr),min(Sg,Dg),min(Sb,Db),min(Sa,Da)) |
Max | 使用源颜色和目标颜色中的较大值,是逐分量比较的。使用的混合等式是: Orgba=(max(Sr,Dr),max(Sg,Dg),max(Sb,Db),max(Sa,Da) |
其他逻辑操作 | 仅在DirectX11.1中支持 |
LightMode标签支持的渲染路径设置选项
标签名 | 描述 |
---|---|
Always | 不管渲染那种路径,该Pass总会被渲染,但不会计算任何光照 |
ForwardBase | 用于前向渲染。该Pass会计算环境光、最重要的平行光、逐顶点/SH光源和Lightmaps |
ForwardAdd | 用于前向渲染。该Pass会计算额外的逐像素光源,每个Pass对应一个光源 |
Deferred | 用于延迟渲染。该Pass会渲染G缓冲(G-Buffer) |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中 |
PrepassBase | 用于遗留的延迟渲染。该Pass会渲染法线和高光反射的指数部分 |
PrepassFinal | 用于遗留的延迟渲染。该Pass通过合并纹理、光照和自发光来渲染得到最后的颜色 |
Vertex、VertexLMRGBM、和VertexLM | 用于遗留的顶点照明渲染 |
前向渲染可以使用的内置光照变量
变量名称 | 类型 | 描述 |
---|---|---|
_LightColor0 | float4 | 该Pass处理的逐像素光源的颜色 |
_WorldSpaceLightPos | float4 | _WorldSpaceLightPos0.xyz是该Pass处理的逐像素光源的位置。如果该光源是平行光,那么_WorldSpaceLightPos0.w是0,其他光源类型w为1 |
_LightMatrix0 | float4x4 | 从世界空间到光源空间的变换矩阵。可以用于采集cookie和光强衰减(attenuation)纹理 |
unity_4LightPosX0, Unity_4LightPosY0, Unity_4LightPosZ0 |
float4 | 仅用于Base Pass。前四个非重要点光源在世界空间中的位置 |
unity_4LightAtten0 | float4 | 仅用于Base Pass。存储了前四个非重要点光源的衰减因子 |
unity_LightColor | float4[4] | 仅用于Base Pass。存储了前四个非重要点光源的颜色 |
前向渲染可以使用的内置光照函数
函数名称 | 描述 |
---|---|
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向。内部实现使用了UnityWorldSpaceLightDir函数。没有被归一化 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间从该点到光源的光照方向。没有被归一化 |
float3 Shade4PointLights(....) | 仅可用于前向渲染中。计算四个点光源的光照,它的参数是已经打包进矢量的光照数据,通常就是前向渲染中使用的内置光照变量,如unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,unity_LightColor和unity_4LightAtten0等。前向渲染通常会使用这个函数来计算逐顶点光照 |
顶点照明渲染路径中可以使用的内置变量
名称 | 类型 | 描述 |
---|---|---|
unity_LightColor | half4[8] | 光源颜色 |
unity_LightPosition | float4[8] | xyz分量是视角空间中的光源位置,如果光源是平行光,那么z分量是0,其他光源类型z分量都是1 |
unity_LightAtten | half4[8] | 光源衰减因子。如果光源是聚光灯,x分量是cos(spotAngle/2),y分量是1/cos(spotAngle/4);如果是其他光源类型,x分量是-1,y分量是1。z分量是衰减的平方,w分量是光源范围开根号的结果 |
unity_SpotDirection | float4[8] | 如果光源是聚光灯的话,值为视角空间的位置;如果是其他类型的光源,值为(0,0,1,0) |
顶点照明渲染路径中可以使用的内置函数
函数名 | 描述 |
---|---|
float3 ShadeVertexLights(float4 vertex,float3 normal) | 输入模型空间中的顶点位置和法线,计算四个逐顶点光源的光照及环境光。内部实现实际上调用了ShadeVertexLightsFull函数 |
float3 ShadeVertexLightsFull (float4 vertex ,float3 normal,int lightCount,bool spotLight) | 输入模型空间中的顶点位置和法线,计算lightCount个光源的光照以及环境光。如果spotLight值为true,那么光源会被当成聚光灯来处理,虽然结果精确,但计算更加耗时;否则,按点光源来处理 |
延迟渲染路径中可以使用的内置变量
名称 | 类型 | 描述 |
---|---|---|
_LightColor | float4 | 光源颜色 |
_LightMatrix0 | float4x4 | 从世界空间到光源空间的变换矩阵。可以用于采样cookie和光强衰减纹理 |
Unity内置的时间变量
名称 | 类型 | 描述 |
---|---|---|
_Time | float4 | t是自该场景加载经过的时间,4个分量的值分别是(t/20,t,2t,3t)。 |
_SinTime | float4 | t是时间的正弦值,4个分量的值分别是(t/8,t/4,t/2,t) |
_CosTime | float4 | t是时间的余弦值,4个分量的值分别是(t/8,t/4,t/2,t) |
unity_DeltaTime | float4 | dt是时间的增量,4个分量的值分别是(dt,1/dt,smoothDt,1/smoothDt) |