Version: 6000.3
语言: 中文
ShaderLab:传统光照
ShaderLab:传统纹理组合

ShaderLab:传统的 alpha 测试

注意:该ShaderLabUnity 用于定义 Shader 对象结构的语言。更多信息
请参阅术语表
此页面上的功能是旧版的,仅用于向后兼容性。如果您的着色器在 GPU 上运行的程序。更多信息
请参阅术语表
源文件包含 HLSL 代码,Unity 会完全忽略这些命令。如果您的着色器源文件不包含 HLSL 代码,Unity 会在导入时将这些命令编译为常规着色器程序。

渲染管线兼容性

功能名称 内置渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
通用渲染管线(URP) 高清渲染管线 (HDRP) 定制 SRP
旧版 alpha 测试 是的

概述

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

语法

AlphaTest Off

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

AlphaTest comparison AlphaValue

将 alpha 测试设置为仅渲染 alpha 值在特定范围内的像素。

比较

比较是以下词语之一:

价值 功能
仅渲染 alpha 大于 AlphaValue 的像素。
GEqual 仅渲染 alpha 大于或等于 AlphaValue 的像素。
仅渲染 alpha 值小于 AlphaValue 的像素。
LEqual 仅渲染 alpha 值小于或等于 AlphaValue 的像素。
平等 仅渲染 alpha 值等于 AlphaValue 的像素。
不等于(NotEqual) 仅渲染 alpha 值与 AlphaValue 不同的像素。
总是 渲染所有像素。这在功能上等同于 AlphaTest Off
从不 不要渲染任何像素。

阿尔法值

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

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

左:alpha 测试。中间:alpha 混合。右:alpha 测试和 alpha 混合的组合。
左:alpha 测试。中间:alpha 混合。右:alpha 测试和 alpha 混合的组合。

在此图中,左侧的树是使用 AlphaTest 渲染的。请注意其中的像素是完全透明的或不透明的。中心树仅使用 Alpha 混合进行渲染 - 请注意附近树枝的透明部分如何覆盖远处的树叶,因为深度缓冲区 保存图像中每个像素的 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
            }
        }
    }
}

请注意,我们在子着色器内部有一些设置,而不是在单个通道中。在子着色器中设置的任何状态都会作为默认值继承到其内部的通道中。

ShaderLab:传统光照
ShaderLab:传统纹理组合