[笔记]ShaderLab——SubShader
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
Stencil{
Ref
Comp
Pass
}
Lighting Off
SetTexture [_MainTex] {}
}
}
-
Pass Pass块导致GameObject的几何体被渲染一次。
-
Cull Back | Front | Off
控制多边形的哪一侧应该被剔除(未绘制),剔除是一种优化,不会使多边形背离观看者。所有多边形都有一个正面和一个背面。剔除利用了大多数物体都被关闭的事实。如果你有一个立方体,你将永远不会看到背对着你的侧面(在它前面总是有一个面向你的一面),所以我们不需要画出面向前的侧面。因此,术语:背面剔除。- Back-不要渲染面向观众的多边形(默认)。
- Front-请勿将多边形朝向观看者。用于翻转物体。
- Off-关禁用剔除,绘制所有的面。用于特殊效果。
-
ZWrite On | Off
深度缓存,控制是否将对象的像素写入深度缓存区,默认为on,如果绘制半透明效果建议关闭 -
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
深度测试。缺省值是LEqual(在现有对象的距离处或远处绘制对象;将对象隐藏在它们后面)。深度测试确保只有最近的曲面对象被绘制在场景中。不透明物体深度从前到后测试,透明物体深度从后往前测试参考1 参考2 -
Blend 在渲染图形时,所有着色器执行完毕并应用了所有纹理后,将像素写入屏幕。它们如何与已经存在的内容相结合由Blend命令控制。Blending就是控制透明的。处于光栅化的最后阶段。
我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标。- Blend Off:关闭混合(这是默认)
- Blend SrcFactor DstFactor:配置并启用混合。生成的颜色与SrcFactor相乘。已经在屏幕上的颜色乘以DstFactor并将两者相加。最终颜色 = (Shader计算出的点颜色值 * 源系数)+(点累积颜色 * 目标系数)
- Blend SrcFactor DstFactor, SrcFactorA DstFactorA:和上面一样,但是使用不同的因子来混合alpha通道。
- BlendOp Op:不要将混合的颜色添加在一起,而是对它们执行不同的操作。
- BlendOp OpColor, OpAlpha:与上述相同,但对颜色(RGB)和alpha(A)通道使用不同的混合操作。
Factor表:
key value one 使用此来让源或目标颜色完全通过 zero 使用它来删除源或目标值。 SrcColor 此阶段的值乘以源颜色值 SrcAlpha 此阶段的值乘以源阿尔法值。 DstColor 这个阶段的值乘以帧缓冲源的颜色值。 DstAlpha 这个阶段的值乘以帧缓冲区来源的alpha值。 OneMinusSrcColor 这个阶段的价值乘以(1 - 源颜色)。 OneMinusSrcAlpha 这个阶段的价值乘以(1 - 源阿尔法)。 OneMinusDstColor 这个阶段的价值乘以(1 - 目的地颜色)。 OneMinusDstAlpha 这个阶段的价值乘以(1 - 目的地阿尔法)。 -
Tag :标签基本上是键值对。Pass内部标签,用于控制此通道在 lighting pipeline中的对象(ambient, vertex lit, pixel lit等)以及其他一些选项。请注意,由Unity识别的以下标签必须位于Pass部分,而不在SubShader内部!
-
Stencil :模板测试stencil test是3d渲染管线中介于透明测试alpha test和深度测试depth test之间的测试,目的是根据条件来比较设置的参考值referenceValue和模板缓冲区stencil buff中对应的值。模板缓冲区可以用作每个像素的通用掩模,用于保存或丢弃像素。模板缓冲区通常是每像素8位整数。该值可以写入,递增或递减。随后的绘制调用可以测试该值,以决定是否应该在运行像素着色器之前丢弃一个像素。判断公式:referenceValue & readMask comparisonFunction stencilBuffValue & readMask
Stencil { Ref referenceValue //参考值,这个值将用来与模板缓冲中的值进行比较。 ReadMask readMask //读取掩码,取值范围也是0-255的整数,默认值为255,二进制位11111111,即读取的时候不对referenceValue和stencilBufferValue(模板缓冲值)产生效果,读取的还是原始值 WriteMask writeMask //输出掩码,当写入模板缓冲时进行掩码操作(按位与【&】),writeMask取值范围是0-255的整数,默认值也是255,即当修改stencilBufferValue值时,写入的仍然是原始值 Comp comparisonFunction //条件,关键字有,Greater(>),GEqual(>=),Less(<),LEqual(<=),Equal(=),NotEqual(!=),Always(总是满足),Never(总是不满足) Pass stencilOperation //条件满足后的处理 Fail stencilOperation //条件不满足后的处理 ZFail stencilOperation //深度测试失败后的处理 } 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,(然后继续自减)。
-
-
Tags 告诉他们如何以及何时期望渲染引擎。
-
Queue 您可以使用“ 队列”标记确定对象的绘制顺序。Shader决定其对象属于哪个渲染队列,透明着色器可以确保它们在所有不透明对象之后被绘制,等等。
- Background - 这个渲染队列在任何其他渲染之前被渲染。你通常使用这个东西,真的需要在后台。
- Geometry (默认) - 这是用于大多数对象。不透明几何使用这个队列。
- AlphaTest - 阿尔法测试的几何使用这个队列。这是一个独立的队列,因为在Geometry绘制所有实体之后,渲染经过Alpha测试的对象效率更高。
- Transparent- 这个渲染队列在Geometry以及AlphaTest以后面的顺序被渲染。任何alpha混合(即不写入深度缓冲区的着色器)应该在这里(玻璃,粒子效果)。
- Overlay - 这个渲染队列是为了覆盖效果。最后呈现的任何东西都应该放在这里(例如镜头光晕)。
Background是1000,Geometry是2000,AlphaTest是2450,Transparent是3000,Overlay是4000。2500(“Geometry+ 500”)被认为是“不透明”,并优化对象的绘制顺序以获得最佳性能。较高的渲染队列被认为是“透明对象”,并按距离对对象进行排序,从最远的那个开始渲染,最近的结束。天空盒被绘制在所有不透明物体和所有透明物体之间。
- RenderType 标记将着色器分类为若干个预定义的组,例如是不透明着色器或经过Alpha测试的着色器等,由“ 着色器替换”(Shader Replacement)使用。常见的值:
- Opaque: 大部分着色器(普通,自发光,反射,地形着色器)。(Normal, Self Illuminated, Reflective, terrain shaders).
- Transparent: 大部分半透明着色器(透明,粒子,字体,地形等着色器)。(Transparent, Particle, Font, terrain additive pass shaders).
- TransparentCutout: 蒙板透明着色器 (Transparent Cutout, two pass vegetation shaders).
- Background: Skybox shaders.
- Overlay: GUITexture,晕,耀斑着色器。GUITexture, Halo, Flare shaders.
- TreeOpaque: terrain engine tree bark.
- TreeTransparentCutout: terrain engine tree leaves.
- TreeBillboard: terrain engine billboarded trees.
- Grass: terrain engine grass.
- GrassBillboard: terrain engine billboarded grass.
- IgnoreProjector 如果IgnoreProjector给出了标签并且其值为“True”,则使用该着色器的对象不会受到Projector的影响。这在半透明物体上最有用,因为Projector没有好的方法来影响它们。
- DisableBatching 是否禁用批处理
- ForceNoShadowCasting 使用该子元素呈现的对象将永远不会投射阴影。
- CanUseSpriteAtlas CanUseSpriteAtlas如果着色器用于精灵,则将标记设置为“False”,并且在将它们打包到图集中时将不起作用
- PreviewType PreviewType指示材质检查器预览应如何显示材质。默认情况下,材质显示为球体,但PreviewType也可以设置为“平面”(将显示为2D)或“天空盒”(将显示为天空盒)。
-
-
LOD 当场景中的GameObject距离摄像机很远时,可以看到的细节数量大大减少。然而,相同数量的三角形将用于渲染对象,即使细节不会被注意到。称为细节层次(LOD)渲染的优化技术允许您减少渲染物体的三角形的数量,因为它与相机的距离增加。只要你的物体不是同时靠近摄像机,LOD就会减少硬件的负担,提高渲染性能。