版本:Unity 6 (6000.0)
语言:英语
ShaderLab:传统光照
ShaderLab:传统纹理组合

ShaderLab:传统 Alpha 测试

注意:此页上的 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
术语表 中查看
功能已过时,仅出于向后兼容性目的进行记录。如果你的 着色器在 GPU 上运行的程序。 更多信息
术语表 中查看
源文件包含 HLSL 代码,Unity 会完全忽略这些命令。如果你的着色器源文件不包含 HLSL 代码,Unity 会在导入时将这些命令编译成常规着色器程序。

渲染管线兼容性

功能名称 内置 渲染管线一系列操作,将场景内容显示在屏幕上。Unity 允许你从预构建的渲染管线中选择,或编写自己的渲染管线。 更多信息
术语表 中查看
通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
传统 Alpha 测试

概述

在最终输出颜色计算完成后,可以选择将颜色的 Alpha 值与固定值进行比较。如果测试失败,像素计算机图像中的最小单位。像素大小取决于你的屏幕分辨率。每个屏幕像素都会计算像素光照。 更多信息
术语表 中查看
不会写入显示器。

语法

AlphaTest Off

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

AlphaTest comparison AlphaValue

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

比较

比较是以下单词之一

大于 仅渲染 Alpha 值大于 AlphaValue 的像素。
大于等于 仅渲染 Alpha 值大于或等于 AlphaValue 的像素。
小于 仅渲染 Alpha 值小于 AlphaValue 的像素。
小于等于 仅渲染 Alpha 值小于或等于 AlphaValue 的像素。
等于 仅渲染 Alpha 值等于 AlphaValue 的像素。
不等于 仅渲染 Alpha 值与 AlphaValue 不同的像素。
始终 渲染所有像素。这在功能上等效于 AlphaTest Off
从不 不渲染任何像素。

AlphaValue

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

详细信息

渲染具有透明部分的凹形物体时,Alpha 测试非常重要。显卡会维护一个记录写入屏幕的每个像素深度的记录。如果新像素比已经渲染的像素更远,则不会将新像素写入显示器。这意味着即使使用 混合,物体也不会显示出来。

在此图中,左侧的树木使用 AlphaTest 渲染。注意其中的像素是完全透明的,或是完全不透明的。中间的树木仅使用 Alpha Blending 渲染 - 注意透明部分的附近树枝如何覆盖远处的树叶,这是由于 深度缓冲区一个存储器,用于保存图像中每个像素的 z 值深度,其中 z 值是每个渲染像素从投影平面到深度。 更多信息
术语表 中查看
造成的。右侧的树木使用最后一个示例着色器渲染 - 该着色器实现混合和 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:传统纹理组合