[笔记]ShaderLab——SubShader

SubShader {
    Tags { "RenderType"="Opaque" }
    LOD 100
    Pass {
        Stencil{
            Ref 
            Comp 
            Pass 
        }
        Lighting Off
        SetTexture [_MainTex] {}
    }
}
  • Pass Pass块导致GameObject的几何体被渲染一次。

    • Cull Back | Front | Off
      控制多边形的哪一侧应该被剔除(未绘制),剔除是一种优化,不会使多边形背离观看者。所有多边形都有一个正面和一个背面。剔除利用了大多数物体都被关闭的事实。如果你有一个立方体,你将永远不会看到背对着你的侧面(在它前面总是有一个面向你的一面),所以我们不需要画出面向前的侧面。因此,术语:背面剔除。

      1. Back-不要渲染面向观众的多边形(默认)。
      2. Front-请勿将多边形朝向观看者。用于翻转物体。
      3. Off-关禁用剔除,绘制所有的面。用于特殊效果。
    • ZWrite On | Off
      深度缓存,控制是否将对象的像素写入深度缓存区,默认为on,如果绘制半透明效果建议关闭

    • ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
      深度测试。缺省值是LEqual(在现有对象的距离处或远处绘制对象;将对象隐藏在它们后面)。深度测试确保只有最近的曲面对象被绘制在场景中。不透明物体深度从前到后测试,透明物体深度从后往前测试参考1 参考2

    • Blend 在渲染图形时,所有着色器执行完毕并应用了所有纹理后,将像素写入屏幕。它们如何与已经存在的内容相结合由Blend命令控制。Blending就是控制透明的。处于光栅化的最后阶段。
      我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标。

      1. Blend Off:关闭混合(这是默认)
      2. Blend SrcFactor DstFactor:配置并启用混合。生成的颜色与SrcFactor相乘。已经在屏幕上的颜色乘以DstFactor并将两者相加。最终颜色 = (Shader计算出的点颜色值 * 源系数)+(点累积颜色 * 目标系数)
      3. Blend SrcFactor DstFactor, SrcFactorA DstFactorA:和上面一样,但是使用不同的因子来混合alpha通道。
      4. BlendOp Op:不要将混合的颜色添加在一起,而是对它们执行不同的操作。
      5. BlendOp OpColor, OpAlpha:与上述相同,但对颜色(RGB)和alpha(A)通道使用不同的混合操作。

      Factor表:

      key value
      one 使用此来让源或目标颜色完全通过
      zero 使用它来删除源或目标值。
      SrcColor 此阶段的值乘以源颜色值
      SrcAlpha 此阶段的值乘以源阿尔法值。
      DstColor 这个阶段的值乘以帧缓冲源的颜色值。
      DstAlpha 这个阶段的值乘以帧缓冲区来源的alpha值。
      OneMinusSrcColor 这个阶段的价值乘以(1 - 源颜色)。
      OneMinusSrcAlpha 这个阶段的价值乘以(1 - 源阿尔法)。
      OneMinusDstColor 这个阶段的价值乘以(1 - 目的地颜色)。
      OneMinusDstAlpha 这个阶段的价值乘以(1 - 目的地阿尔法)。

      通过blend 组合源颜色和目标颜色达到不同效果参考一参考二

    • 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就会减少硬件的负担,提高渲染性能。

你可能感兴趣的:([笔记]ShaderLab——SubShader)