美文网首页Unity干货
[笔记]ShaderLab——SubShader

[笔记]ShaderLab——SubShader

作者: 阿飞咯 | 来源:发表于2017-11-30 20:06 被阅读6次
    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

        本文链接:https://www.haomeiwen.com/subject/ekjbbxtx.html