shader编程4

目录

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 & readMaskcomparisonFunction (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_ 和 unitsFactor 相对于多边形的 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
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值