Version: Unity 6.0 (6000.0)
语言 : 中文
ShaderLab:旧版光照
ShaderLab:旧版纹理组合

ShaderLab:旧版 Alpha 测试

注意:此页面上的__ ShaderLab__Unity 用于定义着色器对象结构的语言。更多信息
See in Glossary
是旧版功能,仅用于向下兼容。如果您的着色器源文件包含 HLSL 代码,Unity 会完全忽略这些命令。如果您的着色器源文件不包含 HLSL 代码,Unity 会在导入时将这些命令编译为常规着色器程序。

渲染管线兼容性

功能名称 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
旧版 Alpha 测试 是 否 否 否

概述

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

语法

AlphaTest Off

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

AlphaTest comparison AlphaValue

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

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]) 来编写。

详细信息

在渲染具有透明部分的凹面对象时,Alpha 测试很重要。显卡将保留写入屏幕的每个像素的深度记录。如果新像素比已经渲染的像素更远,则新像素不会写入显示屏。这意味着即使是使用混合 (Blending),对象也不会穿透显示。

在此图中,左侧的树是使用 AlphaTest 渲染的。请注意其中的像素是完全透明还是不透明。中间的树是仅使用 Alpha 混合 (Alpha Blending) 渲染的;注意由于深度缓冲区的原因,附近树枝的透明部分如何覆盖远处的树叶。右侧的树是使用最后一个示例着色器渲染的;它实现了混合和 Alpha 测试的组合,可隐藏所有瑕疵。

示例

以下是最简单的示例,为其指定带有 Alpha 通道的纹理。仅当 Alpha 大于 0.5 时,该对象才可见

Shader "Simple Alpha Test" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    }
    SubShader {
        Pass {
            // Only render pixels with an alpha larger than 50%
            AlphaTest Greater 0.5
            SetTexture [_MainTex] { combine texture }
        }
    }
}

只有光秃秃一棵树并不好看。让我们添加一些光照并使剔除值可调整:

Shader "Cutoff Alpha" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
        _Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
    }
    SubShader {
        Pass {
            // Use the Cutoff parameter defined above to determine
            // what to render.
            AlphaTest Greater [_Cutoff]
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] { combine texture * primary }
        }
    }
}

渲染植物和树木时,许多游戏都具有 Alpha 测试常见的硬边。解决这个问题的方法是将对象渲染两次。在第一个通道中,我们使用 Alpha 测试仅渲染不透明度超过 50% 的像素。在第二个通道中,我们将图形在被剪切的部分中进行 Alpha 混合,但不记录像素的深度。随着更远的树枝覆盖附近的树枝,我们可能会有点混淆,但在实践中,很难遇到这种情况,因为树叶中有很多视觉细节。

Shader "Vegetation" {
    Properties {
        _Color ("Main Color", Color) = (.5, .5, .5, .5)
        _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
        _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }
    SubShader {
        // Set up basic lighting
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On

        // Render both front and back facing polygons.
        Cull Off

        // first pass:
        // render any pixels that are more than [_Cutoff] opaque
        Pass {
            AlphaTest Greater [_Cutoff]
            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }

        // Second pass:
        // render in the semitransparent details.
        Pass {
            // Dont write to the depth buffer
            ZWrite off
            // Don't write pixels we have already written.
            ZTest Less
            // Only render pixels less or equal to the value
            AlphaTest LEqual [_Cutoff]

            // Set up alpha blending
            Blend SrcAlpha OneMinusSrcAlpha

            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }
    }
}

请注意,我们在 SubShader 中进行设置,而不是在个别通道中。SubShader 中设置的任何状态都将作为默认值继承到着色器内的通道中。

ShaderLab:旧版光照
ShaderLab:旧版纹理组合