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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • <转>我也忘了转自哪里,抱歉,感谢原作者 什么是Shader Shader(着色器)是一段能够针对3D对象进行操作...
    星易乾川阅读 5,584评论 1 16
  • 转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shad...
    游戏开发小Y阅读 3,333评论 0 4
  • 一 婷的妈妈找我求助。 婷婷升入高中了,却迟迟不想入学。妈妈介绍说: 孩子小时候腿被烫伤,小腿上落下一块疤。小学时...
    康老师心育阅读 397评论 2 6
  • 人活一世,不要说建立什么丰功伟绩,流芳百世。至少得有自己的价值观和存在感。人生数十年,浑浑噩噩也是一天,勤勤恳恳...
    倾听青藤阅读 1,558评论 0 1
  • 巴塞罗那虽然一直在travel list上面,不过这次的造访也是意料之外。与上次去柏林差不多,是因为本来去里昂的计...
    layilayo阅读 444评论 0 1