Unity3d Shader Pass 常用命令解释:
Color Color
设定对象的纯色。颜色即可以是括号中的四值(RGBA),也可以是被方框包围的颜色属性名。
Material { Material Block }
材质块被用于定义对象的材质属性。
Lighting On | Off
定义材质块中的设定是否有效,你必须使用Lighting On 命令开启光照,而颜色则通过Color命令直接给出。
SeparateSpecular On | Off
这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
ColorMaterial AmbientAndDiffuse | Emission
使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。
Material Block 材质块
包含材质如何和光线产生作用的设定。这些属性都是可以被忽略的,默认为值都被设定为黑色(不产生作用)
Diffuse Color
漫反射颜色构成。这是对象的基本颜色。
Ambient Color
环境色颜色构成.这是当对象被RenderSettings. 中设定的环境色所照射时对象所表现的颜色。
Specular Color
对象反射高光的颜色。
Shininess Number
加亮时的光泽度,在0和1之间。0的时候你会发现更大的高亮也看起来像漫反射光照,1的时候你会获得一个细微的亮斑。
Emission Color
自发光颜色,当不被任何光照所照到时,对象的颜色
SetTexture [TexturePropertyName] { Texture Block }
分配一个纹理,TextureName必须定义为一个纹理属性。如何应用纹理被定义在TextrueBlock中
纹理块控制纹理如何被应用。在纹理块中能执行3种命令:合并,矩阵和不变色。
Texture block combine command 纹理块合并命令
combine src1 * src2
将源1和源2的元素相乘。结果会比单独输出任何一个都要暗
combine src1 + src2
将将源1和源2的元素相加。结果会比单独输出任何一个都要亮
combine src1 - src2
源1 减去 源2
combine src1 +- src2
先相加,然后减去0.5(添加了一个符号)
combine src1 lerp (src2) src3
使用源2的透明度通道值在源3和源1中进行差值,注意差值是反向的:当透明度值是1是使用源1,透明度为0时使用源3
combine src1 * src2 + src3
源1和源2的透明度相乘,然后加上源3
combine src1 * src2 +- src3
源1和源2的透明度相乘,然后和源3做符号加
combine src1 * src2 - src3
源1和源2的透明度相乘,然后和源3相减
所有源属性都可以是previous, constant, primary or texture其中的一个。
- Previous is the the result of the previous SetTexture.
上一次SetTexture的结果 - Primary is the color from the lighting calculation or the vertex color if it is bound.
来自光照计算的颜色或是当它绑定时的顶点颜色 - Texture is the color of the texture specified by [_TextureName] in the SetTexture (see above).
在SetTexture中被定义的纹理的颜色 - Constant is the color specified in ConstantColor.
被ConstantColor定义的颜色
Modifiers 解释:
- 上述的公式都均能通过关键字 Double 或是 Quad 将最终颜色调高亮度2倍或4倍。
- 所有的src属性,除了差值参数都能被标记一个-符号来使最终颜色反相。
- 所有src属性能通过跟随 alpha 标签来表示只取用alpha通道。
Texture block constantColor command (纹理块constantColor 命令)
ConstantColor color
定义在combine命令中能被使用的不变颜色
Texture block matrix command (纹理块matrix命令)
matrix [MatrixPropertyName]
使用给定矩阵变换纹理坐标
Details 细节
较老的显卡对纹理使用分层的方案。纹理在每一层后被应用一次颜色的修改。对每一个纹理,一般来说纹理都是和上一次操作的结果混合。
注意,在“真正的固定功能”设备(OpenGL, OpenGL ES 1.1, Wii),每个SetTexture阶段的值被限制为0..1范围。其他地方(Direct3D, OpenGL ES 2.0)该范围可能或不可能更高。这可能会影响SetTexture阶段,可能产生的值高于1.0。
Separate Alpha & Color computation 分离的透明度和颜色混合
缺省情况下,混合公式被同时用于计算纹理的RGB通道和透明度。同时,你也能指定只针对透明度进行计算,如下:
SetTexture[_MainTex]{ combine previous * texture, previous + texture }
如上所述,我们对RGB的颜色做乘然后对透明度相加
Specular highlights 反射高光
默认情况下primary颜色是漫反射,阴影色和高光颜色(在光线计算中定义)的加和。如果你将通道设置中的SeparateSpecular 打开,高光色会在混合计算后被加入,而不是之前。这是内置顶点着色器的默认行为。
Graphics hardware support 图形硬件支持
一些旧的显示卡不能支持某些纹理混合模式,不同的卡有不同数目的SetTexture阶段可用。着色器作者应该为他们想支持的卡分开写SubShaders 。
Cull Back | Front | Off
控制几何体的那一面会被剔除(不绘制)
Back
不绘制背离观察者的几何体面。
Front
不绘制面向观察者的几何体面,用于由内自外的旋转对象
Off
显示所有面。用于特殊效果。
ZWrite On | Off
控制是否将来之对象的像素写入深度缓冲(默认开启),如果你正绘制纯色物体,将此项打开。如果你正绘制半透明效果,关闭深度缓冲,更多细节如下
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
深度测试如何执行。缺省是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏他们背后的对象)
Offset Factor , Units
允许你定义用两个参数深度偏移。因子和单位。Factor 缩放Z的最大斜率,几何体的X和Y也一样,units缩放可计算的深度缓冲值。这允许你迫使一个几何体绘制在另一个的上层,尽管他们实际上是在同一个位置。例如偏移0,-1使得靠近摄像机的几何体忽略几何体的斜率,而偏移-1,-1则会几何体在一个几乎擦过的角度被观察使看起来更近些。
Color Color
设定对象的纯色。颜色即可以是括号中的四值(RGBA),也可以是被方框包围的颜色属性名。
Material { Material Block }
材质块被用于定义对象的材质属性。
Lighting On | Off
定义材质块中的设定是否有效,你必须使用Lighting On 命令开启光照,而颜色则通过Color命令直接给出。
SeparateSpecular On | Off
这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
ColorMaterial AmbientAndDiffuse | Emission
使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。
Material Block 材质块
包含材质如何和光线产生作用的设定。这些属性都是可以被忽略的,默认为值都被设定为黑色(不产生作用)
Diffuse Color
漫反射颜色构成。这是对象的基本颜色。
Ambient Color
环境色颜色构成.这是当对象被RenderSettings. 中设定的环境色所照射时对象所表现的颜色。
Specular Color
对象反射高光的颜色。
Shininess Number
加亮时的光泽度,在0和1之间。0的时候你会发现更大的高亮也看起来像漫反射光照,1的时候你会获得一个细微的亮斑。
Emission Color
自发光颜色,当不被任何光照所照到时,对象的颜色
打在对象上的完整光照颜色最终是:
Ambient * RenderSettings ambient setting +
(Light Color * Diffuse + Light Color * Specular) + Emission
Fog { Fog Commands }
Specify fog commands inside curly braces.
在大括号中设定雾命令的内容
Mode Off | Global | Linear | Exp | Exp2
定义雾模式。缺省是全局的,依据雾在渲染设定中是否打开确定可从无变化到平方值
Color ColorValue
设定雾的颜色
Density FloatValue
以指数的方式 设定 雾的密度
Range FloatValue , FloatValue
为linear的雾设定远近距离
AlphaTest Off
渲染所有像素(缺省)
AlphaTest comparison AlphaValue
设定透明度测试只渲染在某一确定范围内的透明度值的像素。
Comparison 对照表
比较下列词语:
Greater | Only render pixels whose alpha is greater than AlphaValue. 大于 |
GEqual | Only render pixels whose alpha is greater than or equal to AlphaValue. 大于等于 |
Less | Only render pixels whose alpha value is less than AlphaValue. 小于 |
LEqual | Only render pixels whose alpha value is less than or equal to from AlphaValue. 小于等于 |
Equal | Only render pixels whose alpha value equals AlphaValue. 等于 |
NotEqual | Only render pixels whose alpha value differs from AlphaValue. 不等于 |
Always | Render all pixels. This is functionally equivalent to AlphaTest Off. |
Never | Don't render any pixels. 不渲染任何像素 |
AlphaValue
一个范围在0到1之间的浮点值。也可以是一个指向浮点属性或是范围属性的索引,在后一种情况下需要使用标准的方括号写法标注索引名字,如([变量名]).
Blend Off
Turn off blending 关闭混合
Blend SrcFactor DstFactor
配置并启动混合。产生的颜色被乘以SrcFactor. 已存在于屏幕的颜色乘以DstFactor,并且两者将被叠加在一起。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
同上,但是使用不同的要素来混合alpha通道
BlendOp Min | Max | Sub | RevSub
不是添加混合颜色在一起,而是对它们做不同的操作。
Properties 属性
以下所有属性对SrcFactor或DstFactor都可用。Source指的是被计算的颜色,Destination是已经在屏幕上的颜色。
One | The value of one - use this to let either the source or the destination color come through fully. |
Zero | The value zero - use this to remove either the source or the destination values. |
SrcColor | The value of this stage is multiplied by the source color value. |
SrcAlpha | The value of this stage is multiplied by the source alpha value. |
DstColor | The value of this stage is multiplied by frame buffer source color value. |
DstAlpha | The value of this stage is multiplied by frame buffer source alpha value. |
OneMinusSrcColor | The value of this stage is multiplied by (1 - source color). |
OneMinusSrcAlpha | The value of this stage is multiplied by (1 - source alpha). |
OneMinusDstColor | The value of this stage is multiplied by (1 - destination color). |
OneMinusDstAlpha | The value of this stage is multiplied by (1 - destination alpha). |
Pass Tags
通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果。
Syntax 语法
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
指定TagName1 的值为 Value1 ,TagName2 的值为 Value2 你可以指定很多你喜欢的标签
Details 细节
标签基本上是键-值对的形式。 内部的Pass 标签用来控制光照管道(环境光照,顶点关照和像素光照)中pass 的任务和一些其它选项。注意以下的标签必须在pass段内部,而不是在SubShader中被识别。
LightMode tag 光照模式标签
LightMode 标签定义了光照观点中的pass的任务。查阅render pipeline了解更多细节。这些标签很少手动使用。常用的shader 需要与光照进行互动的Shader写成表面着色器 然后在去关联那些细节
LightMode 的可选值:
- Always:
总是渲染。没有光照应用。 - ForwardBase:
用于正向渲染,环境主要方向灯和定点光/SH 等的应用 - ForwardAdd:
用于正向渲染,附加的像素光被应用,每个光照一个pass - PrepassBase:
用于延迟光照,渲染法线/镜面指数。lor function)。 - PrepassFinal:
用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色 - Vertex:
用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用 - VertexLMRGBM:
用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是RGBM 编码 - VertexLM:
用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU) - ShadowCaster:
将物体当做阴影产生者来渲染 - ShadowCollector:
为了正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。
Name
Syntax 语法
Name "PassName"
为当前通道命名 PassName
Details 细节
一个通道能被赋予一个名字以便UsePass 命令能索引到它。
BindChannels
BindChannels命令 允许你指定顶点数据如何映射到显卡中。
可编程顶点着色器使用时,BindChannels将没有效果。在这种情况下,绑定受顶点着色器输入控制。
默认情况下,Unity3D 会为你计算并绑定,但在某些情况下,你要使用自定义绑定。
例如:你可以在第1个纹理处理阶段映射主UV 然后在第2个纹理处理阶段使用次要UV。或者告诉硬件需要考虑顶点颜色
Syntax 语法
BindChannels { Bind "source", target }
例如:指定顶点数据源映射到目标硬件。
Source 可以是下面其中一个
- Vertex: vertex position 顶点:顶点的位置
- Normal: vertex normal 法线:顶点的法线
- Tangent: vertex tangent 切线:顶点的切线
- Texcoord: primary UV coordinate 主要的UV坐标
- Texcoord1: secondary UV coordinate 次要的UV坐标
- Color: per-vertex color 颜色:每个顶点颜色
Target can be one of: Target可以是下面其中的一个:
- Vertex: vertex position 顶点:顶点的位置
- Normal: vertex normal 法线:顶点的法线
- Tangent: vertex tangent 切线:顶点的切线
- Texcoord0, Texcoord1, ...: texture coordinates for corresponding texture stage 各个纹理处理阶段的纹理坐标
- Texcoord: texture coordinates for all texture stages 所有纹理处理阶段的纹理坐标
- Color: vertex color 颜色:顶点颜色
UsePass "Shader/Name"
插入所有来自给定着色器中的给定名字的通道。Shader/Name包含了通过斜杠字符分割的着色器的名字和通道的名字
某些着色器重用其他着色器中已存在的通道,减少重复的代码。例如,在许多像素光照着色器中,阴影色或顶点光照通道在在相应的顶点光照着色器中是相同的。UsePass命令只是包含了另一个着色器的给定通道。例如当如下的命令可以使用内置的高光着色器中的名叫"Base"的通道:
UsePass "Specular/BASE"
为了让UsePass能正常工作,必须给希望使用的通道命名。通道中的Name命令将提供这个名字:
Name "MyPassName"
注意,所有通道名字都是大写开头,因此UsePass必须使用大写开头的名字来书写索引 。
(二)GrabPass 是一种特殊的通道类型 - 捕获物体所在位置的屏幕的内容并写入到一个纹理中。这个纹理能被用于后续的通道中完成一些高级图像特效。
Syntax 语法
有两种方式将GrabPass放入一个 subshader 中:
- GrabPass {} 能捕获当前屏幕的内容到一个纹理中。纹理能在后续通道中通过 _GrabTexture 进行访问。注意:这种形式的捕获通道将在每一个使用该通道的对象渲染过程中执行昂贵的屏幕捕获操作
- GrabPass { "TextureName" } 能捕获屏幕内容到一个纹理中,但只会在每帧中处理第一个使用给定纹理名的纹理的对象的渲染过程中产生捕获操作。纹理在未来的通道中可以通过给定的纹理名访问。当你在一个场景中拥有多个使用GrabPass的对象时将提高性能。
这里有一种反相已被渲染的像素的颜色的昂贵方式:
Shader "GrabPassInvert" {
SubShader {
// Draw ourselves after all opaque geometry
// 在所有不透明几何体之后自画
Tags { "Queue" = "Transparent" }
// Grab the screen behind the object into _GrabTexture
// 捕获对象后的屏幕到_GrabTexture GrabPass { }
// Render the object with the texture generated above, and invert it's colors
// 用前面捕获的纹理渲染对象,并反相它的颜色 Pass {
SetTexture [_GrabTexture] { combine one-texture }
}
}
}
这个着色器有两个通道:第一个通道捕获在渲染时刻对象背后的所有图像,然后执行第二次通道。当然,在现在,实现同样的效果,使用反相 混合模式将更加廉价。
(三)Tags 子着色器使用标签来告诉渲染引擎期望何时和如何渲染对象。
Syntax 语法
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
为标签 指定 值。能设定任意多标签
标签是标准的键值对。在其中有一个SubShader 标签被用于决定渲染的次序和子着色器中的其他标签。
Rendering Order - Queue tag
渲染次序 - 队列 标签
你能使用 Queue 标签决定对象被渲染的次序。着色器决定它所归属的对象的渲染队列,任何透明渲染器可以通过这个办法确认可以在所有不透明对象渲染后再进行渲染。
有四种预定义的渲染队列,在预定义队列之间还可以定义更多队列
-
- Background -
后台 - 这个渲染队列在所有队列之前被渲染,被用于渲染天空盒之类的对象。 - Geometry (default) -
几何体(缺省) - 这个队列被用于大多数对象。 不透明的几何体使用这个队列。 - Transparent -
透明 - 这个渲染队列在几何体队列之后被渲染,采用由后到前的次序。任何采用alpha混合的对象(不对深度缓冲产生写操作的着色器)应该在这里渲染(玻璃,粒子效果) - Overlay -
覆盖 - 这个渲染队列被用于实现叠加效果。任何需要最后渲染的对象应该放置在此处。(如镜头光晕)
- Background -
Shader "Transparent Queue Example" {
SubShader {
Tags {"Queue" = "Transparent" }
Pass {
// rest of the shader body... }
}
}
举例说明如何在透明队列中渲染对象。
几何体渲染队列为了达到最优的性能优化了对象的绘制次序。其他渲染队列依据举例排序对象,从最远的对象开始渲染到最近的对象。
对于特殊的需要可以使用中间队列来满足。在Unity实现中每一个队列都被一个整数的索引值所代表。后台为1000,几何体为2000,透明为3000,叠加层为4000. 着色器可以自定义一个队列
Tags { "Queue" = "Geometry+1" }
这会使对象在所有不透明的对象渲染之后但却在所有透明物体前被渲染,该渲染队列的索引值为2001.当你希望某些对象总是在其他某些对象前被绘制的情况下,这种能力对你有用。例如,在大多数时候,透明的水总是应该在所有不透明的物体之后并在透明对象前被渲染。
IgnoreProjector tag 忽略投影 标签
如果设置忽略投影标签为"True",那么使用这个着色器的对象将不会被投影机所影响。对半透明的物体来说最有用处,因为没有对他们产生投影的好办法。
Fallback定义在所有子着色器后。简单来说,它表示"如果没有任何子着色器能被运行在当前硬件上,请尝试使用降级着色器"。
Syntax 语法
Fallback "name"
退回到给定名称的着色器
Fallback Off
显式声明没有fallback并且不会打印任何警告,甚至没有子着色器会被运行
Details 细节
Fallback标志的功能和将另一个着色器的所有子着色器拷贝到标志所在位置所起的功能相同
Example 示例
Shader "example" {
// properties and subshaders here...
// 属性和子着色器在此
Fallback "otherexample"
}
Category 分类是如下任意命令的逻辑组。大多数情况下是被用于继承渲染状态。例如,你的着色器可以有多个子着色器,他们都需要关闭雾效果,附加的混合,等等。你能在这些情况使用种类:
Shader "example" {
Category {
Fog { Mode Off }
Blend One One
SubShader {
// ... }
SubShader {
// ... }
// ...}
}
分类块只影响着色器解析,作用和粘贴状态集到分类所包含的子着色器块中的效果一样。完全不影响着色器的运行速度。
//t是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t*2, t*3)
_Time float4 time (t/20, t, t*2, t*3), //t 是时间的正弦值,4个分量分别是 (t/8, t/4, t/2, t)
_SinTime float4 Sine of time: (t/8, t/4, t/2, t).//t 是时间的余弦值,4个分量分别是 (t/8, t/4, t/2, t)
_CosTime float4 Cosine of time: (t/8, t/4, t/2, t).//dt 是时间增量,4个分量的值分别是(dt, 1/dt, smoothDt, 1/smoothDt)
nity_DeltaTime float4 Delta time: (dt, 1/dt, smoothDt, 1/smoothDt).