您当前的位置: 首页 > 

果冻喜之郎

暂无认证

  • 2浏览

    0关注

    79博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

shader编程4

果冻喜之郎 发布时间:2021-08-12 10:40:17 ,浏览量:2

目录

alpha测试       1.0

alpha测试       2.0

模板测试        1.0

模板测试        2.0

深度测试

alpha测试        1.0

在计算出最终输出颜色之后,颜色可选择性地将其 Alpha 值与固定值进行比较。如果测试失败,则不会将像素写入显示屏。

语法
AlphaTest Off

渲染所有像素(默认值),或者…

AlphaTest comparison AlphaValue

设置 Alpha 测试以仅渲染 Alpha 值在特定范围内的像素。

Comparison

Comparison 是以下词语之一: 

Greater仅渲染 Alpha 大于 AlphaValue 的像素。GEqual仅渲染 Alpha 大于或等于 AlphaValue 的像素。Less仅渲染 Alpha 值小于 AlphaValue 的像素。LEqual仅渲染 Alpha 值小于或等于 AlphaValue 的像素。Equal仅渲染 Alpha 值等于 AlphaValue 的像素。NotEqual仅渲染 Alpha 值不等于 AlphaValue 的像素。Always渲染所有像素。这在功能上等同于 AlphaTest Off。Never

不渲染任何像素。

AlphaValue

一个介于 0 到 1 之间的浮点数。这也可以是 float 或 range 属性的变量引用,在这种情况下,应使用标准方括号表示法 ([VariableName]) 来编写。

Shader "Hidden/text6"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _alpha ("alpha",Range(0,1)) = 0
    }
    SubShader
    {
        
        Pass
        {
           AlphaTest Greater [_alpha]    //alpha测试
           SetTexture[_MainTex]{    //设置材质
               combine texture * Previous
           }
        }
    }
}

滑动alpha滑杆时不同的渲染结果

 alpha测试        2.0
SubShader
{
    Blend SrcAlpha OneMinusSrcAlpha

    Pass{

    fixed4 frag (v2f i) : SV_Target
            {
              
                fixed4 col = tex2D(_MainTex, i.uv);
                // just invert the colors
                  
                if (col.a < 0.5){    //直接判断透明度
                    return fixed4 (0,0,0,0);
                }

                return col;
            }
     }
}
模板测试        1.0

实现功能:通过面片可以看见立方体,否则看不到

ShaderLab:模板

模板缓冲区可用作一般目的的每像素遮罩,以便保存或丢弃像素。

模板缓冲区通常是每像素 8 位整数。该值可以写入、递增或递减。后续绘制调用可以根据该值进行测试,以确定在运行像素着色器之前是否应丢弃像素。

语法 Ref
    Ref referenceValue

要比较的参考值(如果 Comp 是 always 以外的任何值)和/或要写入缓冲区的值(如果 Pass、Fail 或 ZFail 设置为替换)。值为 0 到 255 之间的整数。

ReadMask
    ReadMask readMask

这是一个 8 位掩码,值为 0 到 255 之间的整数,用于比较参考值和缓冲区的内容 (referenceValue & readMask) comparisonFunction (stencilBufferValue & readMask)。默认值:_255_。

WriteMask
    WriteMask writeMask

这是一个 8 位掩码,值为 0 到 255 之间整数,写入缓冲区时使用。请注意,与其他写掩码一样,它指定写操作将影响模板缓冲区的哪些位(例如 WriteMask 0 表示不会影响任何位,也不会写入 0)。默认值:_255_。

Comp
    Comp comparisonFunction

用于将参考值与缓冲区的当前内容进行比较的函数。默认值:_always_。

Pass
    Pass stencilOperation

如果模板测试(和深度测试)通过,如何处理缓冲区的内容。默认值:_keep_。

Fail
    Fail stencilOperation

如果模板测试(和深度测试)失败,如何处理缓冲区的内容。默认值:_keep_。

ZFail
    ZFail stencilOperation

如果模板测试通过但深度测试失败,如何处理缓冲区的内容。默认值:_keep_。

Comp、Pass、Fail 和 ZFail 将应用于正面几何体,除非指定了 _Cull Front_,在这种情况下将应用于背面几何体。您还可以通过定义 CompFront、PassFront、FailFront 或 ZFailFront(用于正面几何体)以及 CompBack、PassBack、FailBack 或 ZFailBack(用于背面几何体)来显式指定双面模板状态。

比较函数

比较函数为以下函数之一:

Greater仅渲染参考值大于缓冲区值的像素。GEqual仅渲染参考值大于或等于缓冲区值的像素。Less仅渲染参考值小于缓冲区值的像素。LEqual仅渲染参考值小于或等于缓冲区值的像素。Equal仅渲染参考值等于缓冲区值的像素。NotEqual仅渲染参考值不同于缓冲区值的像素。Always使模板测试始终通过。Never使模板测试始终失败。 模板操作

模板操作为以下操作之一:

Keep保持缓冲区的当前内容。Zero将 0 写入缓冲区。Replace将参考值写入缓冲区。IncrSat递增缓冲区中的当前值。如果该值已经是 255,则保持为 255。DecrSat递减缓冲区中的当前值。如果该值已经是 0,则保持为 0。Invert将所有位求反。IncrWrap递增缓冲区中的当前值。如果该值已经是 255,则变为 0。DecrWrap递减缓冲区中的当前值。如果该值已经是 0,则变为 255。

 plane:

Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _MaskValue ("MaskValue",Int) = 1
    }
    SubShader
    {

        Pass
        {
            Stencil {
                Ref [_MaskValue]
                Comp always     //面片需要一直被渲染
                Pass replace    //如果通过测试则将1写入缓冲区
            }
        }
    }

cube:

Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
         _MaskValue ("MaskValue",Int) = 1
    }
    SubShader
    {
       ZWrite on        //深度测试,当cube位于plane下方时也可以看到
       ZTest Always
        Pass
        {
            Stencil {
                Ref [_MaskValue]
                Comp Equal     //判断条件为相等 当前要比较的参考值与缓冲区相等
            }
        }
    }

    

模板测试        2.0

通过不同的面可以看到不同的游戏物体

创建四个plane,更改MaskValue分别为【1,2,3,4】,创建四个物体,更改MaskValue分别与四个plane对应

 深度测试

ShaderLab:剔除和深度测试

剔除是一种优化方式,即不渲染背离观察者的多边形。所有多边形都有正面和背面。剔除利用大多数对象均为封闭体这一事实;如果您有一个立方体,您将永远不会看到背离您的面(前方始终只有一面朝向您),所以我们不需要绘制背离的面。因此有了“背面剔除”一词。

让渲染看起来正确的另一个功能是“深度测试”。深度测试确保在场景中仅绘制距离最近的表面对象。

语法 Cull
Cull Back | Front | Off

控制应该剔除多边形的哪些面(不绘制)

  • Back 不渲染背离观察者的多边形_(默认值)_。

  • Front 不渲染面向观察者的多边形。用于从里到外翻转对象。

  • Off 禁用剔除 - 绘制所有面。用于特殊效果。

ZWrite
ZWrite On | Off

控制是否将此对象的像素写入深度缓冲区(默认值为 _On_)。如果要绘制实体对象,请将其保留为 on。如果要绘制半透明效果,请切换到 ZWrite Off。有关更多详细信息,请参阅下文。

ZTest
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

应如何执行深度测试。默认值为 _LEqual_(将前方或远处的对象作为现有对象绘制;隐藏其后面的对象)。

Offset
Offset Factor, Units

允许使用两个参数指定深度偏移:_factor_ 和 units。Factor 相对于多边形的 X 或 Y 缩放最大 Z 斜率,而 units 缩放最小可分辨深度缓冲区值。因此可强制将一个多边形绘制在另一个多边形上,尽管它们实际上位于相同位置。例如,Offset 0, -1 将多边形拉近摄像机并忽略多边形的斜率,而 Offset -1, -1 在观察掠射角时进一步拉近多边形。

 半透明着色器

åéæå¯¹è±¡ï¼å·¦ï¼æ åéæ/漫å°çè²å¨ï¼å³ï¼åå¥å°æ·±åº¦ç¼å²åºççè²å¨ã

Shader "Transparent/Diffuse ZWrite" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}
SubShader {
    Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
    LOD 200

    // 仅渲染到深度缓冲区的额外通道
    Pass {
        ZWrite On
        ColorMask 0
    }

    // 粘贴在透明/漫射着色器的前向渲染通道中
    UsePass "Transparent/Diffuse/FORWARD"
}
Fallback "Transparent/VertexLit"
}

 玻璃剔除:适用于凸面体对象(球体、立方体或汽车挡风玻璃)

Shader "Simple Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }

    SubShader {
        // 我们在子着色器中定义通道以便在多个通道中使用该材质。
        // 此处定义的任何内容都将成为所有包含的通道的默认值。
        Material {
            Diffuse [_Color]
            Ambient [_Color]
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]
        }
        Lighting On
        SeparateSpecular On

        // 设置 Alpha 混合
        Blend SrcAlpha OneMinusSrcAlpha

        // 渲染对象的背面部分。
        // 如果对象为凸面体,那么这些部分始终
        // 比正面更远。
        Pass {
            Cull Front
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // 渲染面向我们的对象部分。
        // 如果对象为凸面体,那么这些部分将
        // 比背面更近。
        Pass {
            Cull Back
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
    }
}
关注
打赏
1655963140
查看更多评论
立即登录/注册

微信扫码登录

0.0899s