一.Tags(标签)
通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果。注意的是,SubShader和Pass两个地方的Tags的不同.
除了内置标签被统一,你可以使用你自己的标签和使用Material.GetTag函数查询它们。
1.)SubShader Tags
1.”Queue”标签。定义渲染顺序。预制的值为
(1)”Background”。值为1000。
(2)”Geometry”。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。
(3)”AlphaTest”。值为2450。已进行AlphaTest的物体在这个队列。 物体都是按空间位置的从远到近进行渲染。
(4)”Transparent”。值为3000。透明物体。
(5)”Overlay”。值为4000。比如镜头光晕。
(6)用户可以定义任意值,比如”Queue”=”Geometry+10”
天空盒在所有不透明物体和所有透明物体之间渲染.实体先前往后,透明先后往前
- “RenderType”标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。Unity内置的RenderType包括:
(1)”Opaque”:绝大部分不透明的物体都使用这个;
(2)”Transparent”:绝大部分透明的物体、包括粒子特效都使用这个;
(3)”Background”:天空盒都使用这个;
(4)”Overlay”:GUI、镜头光晕都使用这个;
(5)还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串。
3.”ForceNoShadowCasting”,值为”true”时,表示不接受阴影。
4.”IgnoreProjector”,值为”true”时,表示不接受Projector组件的投影。 - "DisableBatching "="True" 关闭了批处理
https://docs.unity3d.com/Manual/SL-SubShaderTags.html
2.)Pass Tags
LightMode 标签定义了光照观点中的pass的任务。查阅render pipeline了解更多细节。这些标签很少手动使用。常用的shader 需要与光照进行互动的Shader写成表面着色器 然后在去关联那些细节
除最重要的ForwardBase、ForwardAdd外,这里需额外提醒的Tag取值可包括:
1.Always,永远都渲染,但不处理光照。
2.ShadowCaster,用于渲染产生阴影的物体。
3.ShadowCollector,用于收集物体阴影到屏幕坐标Buff里。
二.Alpha Test (透明度测试)
Clip(float4 x) 任何给定参数的任何一个分量是负数,舍弃像素
void Clip(float4 x)
{
if(any(x<0))
discard
}
三.Blend(混合)
Blend Off: Turn off blending (this is the default)
Blend SrcFactor DstFactor: 开启混合,并设定混合因子,源颜色 * SrcFactor + 目标颜色 * DstFactor
Blend SrcFactor DstFactor, SrcFactorA DstFactorA: 和上面的类似,只是使用了不同的混合因子来混合透明通道
BlendOp Op: 取代加,可以选择不同的混合方式
BlendOp OpColor, OpAlpha: Same as above, but use different blend operation for color (RGB) and alpha (A) channels.
Blend factors 混合因子总共有十种可选类型
One 值为1,使用此因子来让帧缓冲区源颜色或是目标颜色完全的通过。
zero 值为0,使用此因子来删除帧缓冲区源颜色或目标颜色的值。
SrcColor 使用此因子为将当前值乘以帧缓冲区源颜色的值
SrcAlpha 使用此因子为将当前值乘以帧缓冲区源颜色Alpha的值。
DstColor 使用此因子为将当前值乘以帧缓冲区目标颜色的值。
DstAlpha 使用此因子为将当前值乘以帧缓冲区目标颜色Alpha分量的值。 OneMinusSrcColor 使用此因子为将当前值乘以(1 -帧缓冲区源颜色值) OneMinusSrcAlpha 使用此因子为将当前值乘以(1 -帧缓冲区源颜色Alpha分量的值) OneMinusDstColor 使用此因子为将当前值乘以(1 –目标颜色值)
OneMinusDstAlpha 使用此因子为将当前值乘以(1 –目标Alpha分量的值)
Blend operations :
Add Add source and destination together.
Sub a - b
RevSub b - a
Min Use the smaller of source and destination.
Max Use the larger of source and destination.
例如:BlendOp Min
https://docs.unity3d.com/Manual/SL-Blend.html
三.ZTest 和ZWrite(深度测试和深度写入)
ZWrite On | Off 默认是打开状态,假如深度测试通过,则可以把当前像素的z值写入深度缓冲,当然也可以不写入(ZWrite Off).
ZTest ,深度测试;LEqual ,小于等于.即 当前像素的深度值 <= 深度缓冲区,深度测试通过.
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always , ZTest Off 等同于 ZTest Always。Never 像素总是不通过
四.Stencil Buffer&Stencil Test(模板缓冲和模板测试)
stencil与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值(通常的话是个8位整数)。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前
每个片元都需要通过模板测试和深度测试,才能显示到屏幕上.
stencil{
Ref referenceValue //设定参考值referenceValue,这个值将用来与模板缓冲中的值进行比较。referenceValue是一个取值范围位0-255的整数。
ReadMask readMask //设定掩码值
WriteMask writeMask //写入模板缓冲时进行掩码操作
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}
if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)
通过片元
Comp,Pass,Fail 和ZFail将会应用给背面消隐的几何体(只渲染前面的几何体),除非Cull Front被指定,在这种情况下就是正面消隐的几何体(只渲染背面的几何体)。你也可以精确的指定双面的模板状态通过定义CompFront,PassFront,FailFront,ZFailFront(当模型为front-facing geometry使用)和ComBack,PassBack,FailBack,ZFailBack(当模型为back-facing geometry使用)
1.comparisonFunction
Less | Greater | LEqual | GEqual | Equal | NotEqual | Always 和深度测试类似
2.stencilOperation
Keep 保留当前缓冲中的内容,即stencilBufferValue不变。
Zero 将0写入缓冲,即stencilBufferValue值变为0。
Replace 将参考值写入缓冲,即将referenceValue赋值给stencilBufferValue。
IncrSat stencilBufferValue加1,如果stencilBufferValue超过255了,那么保留为255,即不大于255。
DecrSat stencilBufferValue减1,如果stencilBufferValue超过为0,那么保留为0,即不小于0。
Invert 将当前模板缓冲值(stencilBufferValue)按位取反
IncrWrap 当前缓冲的值加1,如果缓冲值超过255了,那么变成0,(然后继续自增)。
DecrWrap 当前缓冲的值减1,如果缓冲值已经为0,那么变成255,(然后继续自减) 。