Unity之Shader Alpha 测试 和 8中比较条件 - 七

本文介绍了Alpha测试的概念及其在Shader中的应用,包括如何通过不同的条件判断(如Greater、Less等)来控制图像的透明度,进而实现图像的精确渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Alpha 测试 和 8中比较条件

通道道是8位的灰度图像,能够显示1-256种灰度,用来表示颜色的RGBA值。R红色,G绿色,B蓝色,A透明值, 其中RGB为原色通道,A为透明通道。
在通道中,以白色代替透明表示要处理的部分,以黑色表示不需处理的部分。所有通道取值范围是 [0,255], 但是在Shader里取值范围是[0,1], 0和1分辨对应0和255

Alpha 检测用于在 fragment 函数完成最终的计算之后,在即将写入到帧中之前,通过和一个固定的数值比较,来决定当前fragment函数的计算结果到底要不要写入到帧中,从而输出到屏幕上。
Alpha检测的具体比较数值可以在运行时确定,而AlphaTest的比较条件有 
Greater  点的Alpha值大于 X时渲染,          
GEuqal   点的Alpha值大于等于 X时渲染,
Equal    点的Alpha值等于 X时渲染,
NotEqual 点的Alpha值不等于X时渲染,
Less     点的Alpha值小于 X时渲染,
LEqual   点的Alpha值小于等于 X时渲染,
Always   全渲染,
Never    全部渲染
这8中情况

使用方法如下
AlphaTest Less 0.5
AlphaTest Greater 0.3

注:使用AlphaTest需要贴图带有 Alpha通道
在代码中的实际运用如下

Shader "Custom/PassFour" {
    Properties {
        //定义一个贴图
        _MainTex ("Base (RGB)", 2D) = "white" {} 
    }
    SubShader 
    {       
        Tags {"RenderType" = "Opaque" "IGNOREPROJECTOR" = "TRUE" "QUEUE" = "Transparent"}
        LOD 200

        Pass
        {
            //AlphaTest Greater 0.6
            //AlphaTest Less 0.5
            AlphaTest Greater 0.4
            AlphaTest Less 0.9

            // 通过绑定固定通道来使用定点色
            BindChannels
            {
                Bind "Vertex", vertex     // 绑定定点
                Bind "Normal", normal     
                Bind "Color", color
                Bind "Texcoord", texcoord0
                Bind "Texcoord", texcoord1
            }

            //给材质设置 贴图 
            SetTexture [_MainTex] 
            {
                Combine texture * primary double
            }
        }
    } 
    FallBack "Diffuse"
}

效果如下
选择材质
这里写图片描述
选择贴图信息如下
这里写图片描述

效果一
这里写图片描述
效果二
这里写图片描述
效果三
这里写图片描述

根据实际情况选择适当的组合
所选贴图要有 RGBA 即需要带有 Alpha通道

### 如何在 Unity 中进行 Shader 模板测试UnityShader 编写过程中,模板测试(Stencil Test)是一种强大的工具,可以用来控制哪些像素应该被绘制到屏幕上。这通常通过向 Shader 添加 `Stencil` 块来实现。 #### 定义 Stencil 测试条件 当定义一个带有模板测试功能的 Shader 时,可以在 SubShader 或 Pass 范围内指定 `Stencil` 块: ```c SubShader { Tags { "RenderType"="Opaque" } Pass { Stencil { Ref [_RefVal] ReadMask [_ReadMask] WriteMask [_WriteMask] Comp [_CompFunc] Pass [_PassOp] Fail [_FailOp] ZFail [_ZFailOp] } CGPROGRAM ... ENDCG } } ``` 上述代码片段展示了如何配置不同的操作选项[^1]。这些参数允许设置参考值 (`Ref`)、读取掩码 (`ReadMask`) 写入掩码 (`WriteMask`),以及比较函数 (`Comp`) 及其相应的通过/失败行为(`Pass`, `Fail`, `ZFail`)。 #### 实现逻辑判断 对于每一个渲染的像素,Unity 使用下面给出的公式来进行模板缓冲区中的数据对比: if (referenceValue & readMask comparisonFunction stencilBufferValue & readMask) 如果此表达式的计算结果为真,则执行后续的绘图指令;反之则丢弃该像素不作处理[^2]。 #### 创建简单的 Vertex/Fragment Shader 示例 为了更好地理解这一过程,这里提供了一个基础版本的顶点片段着色器的例子,适用于不需要考虑复杂光照情况下的特效或 UI 组件开发场景: ```hlsl Shader "Custom/SimpleStencilTest" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Tint Color", Color) = (1,1,1,1) // 控制模板测试的行为属性 [Enum(UnityEngine.Rendering.CompareFunction)]_CompFunc("Comparison Function", Float) = 8 // 默认等于 [IntRange]_RefVal("Reference Value", Range(0, 255)) = 0 [IntRange]_ReadMask("Read Mask", Range(0, 255)) = 255 [IntRange]_WriteMask("Write Mask", Range(0, 255)) = 255 // 设置通过未通过的操作 [Enum(UnityEngine.Rendering.StencilOp)]_PassOp("Pass Operation", Float) = 0 // Keep [Enum(UnityEngine.Rendering.StencilOp)]_FailOp("Fail Operation", Float) = 6 // Zero [Enum(UnityEngine.Rendering.StencilOp)]_ZFailOp("Depth Fail Operation", Float) = 6 // Zero } SubShader { Tags {"Queue"="Geometry"} Cull Off Pass { Name "FORWARD" Stencil { Ref[_RefVal] ReadMask[_ReadMask] WriteMask[_WriteMask] Comp[_CompFunc] Pass[_PassOp] Fail[_FailOp] ZFail[_ZFailOp] } CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 pos : SV_POSITION; }; sampler2D _MainTex; fixed4 _Color; v2f vert(appdata_t IN) { v2f OUT; OUT.pos = UnityObjectToClipPos(IN.vertex); OUT.uv = IN.uv; return OUT; } fixed4 frag(v2f i) : COLOR { fixed4 col = tex2D(_MainTex, i.uv) * _Color; clip(col.a - 0.01); // Alpha testing to discard transparent pixels. return col; } ENDCG } } } ``` 这段代码实现了基本的颜色混合效果,并且包含了完整的模板测试配置项,使得开发者可以根据实际需求调整各个参数以达到预期的效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值