传统的 Alpha Testing
alpha测试是拒绝将像素写入屏幕的最后机会。
注:当使用片段程序时,透明度测试命令是没有效果的;大多数平台上的测试是使用HLSL着色器做clip()功能。建议使用可编程着色器这些而不是SetTexture命令。
在计算最终输出颜色后,颜色可以相对于固定值具有alpha值。如果测试失败,则像素不会写入显示器。
语法:
AlphaTest Off
渲染所有像素(默认)或…
比较: AlphaTest alphavalue
设置alpha测试只渲染alpha值在一定范围内的像素。
比较:
比较是下列单词之一:
关键字 | 说明 |
---|---|
Greater | 只渲染像素的α大于alphavalue。 |
GEqual | 只渲染像素的α大于或等于alphavalue。 |
Less | 小于 |
LEqual | 小于等于 |
Equal | 等于 |
NotEqual | 不等于 |
Always | 渲染所有像素。这是功能上等同于透明度测试了。 |
Never | 不渲染任何像素。 |
AlphaValue
介于1和0之间的浮点数。这也可以是一个变量引用类型或范围的属性,在这种情况下,应该使用标准的方括号([变量名])。
([VariableName])。
细节:
在透明物体上绘制凹形物体时,α测试非常重要。图形卡维护记录到屏幕上的每个像素的深度记录。如果一个新像素比已经渲染的像素更远,新像素就不会写入显示器。这意味着即使混合,对象也不会显示通过。

在这张图中,左边的树使用透明度测试。注意它的像素是完全透明的还是不透明的。中心树只使用alpha混合,注意附近分支的透明部分是如何覆盖远端叶子的,因为深度缓冲。右边的树使用最后一个示例着色器渲染,它实现了混合和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测试仅呈现像素超过50%不透明。在第二步中,我们alpha-blend图形的部分切掉,没有记录像素的深度。我们可能会有点混乱远分支覆盖附近的,但在实践中,很难看到叶子有很多视觉细节。
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
}
}
}
}
Note that we have some setup inside the SubShader, rather than in the individual passes. Any state set in the SubShader is inherited as defaults in passes inside it.