ShaderLab中的一些表格

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)

你可能感兴趣的:(ShaderLab中的一些表格)