透明度测试是阻止像素被写到屏幕的最后机会。在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会写到显示输出中。常用语法如下。
AlphaTest 开关状态
Off(缺省)渲染所有像素,On开启透明度测试。
AlphaTest 比较模式 测试值
设置透明度测试只渲染透明度值在某一确定范围内的像素。常用比较模式如表。
Alpha测试模式
| 测试模式 | 说明 |
|
Greater |
大于 |
| GEqual | 大于等于 |
| Less | 小于 |
| LEqual | 小于等于 |
| Equal | 等于 |
| NotEqual | 不等于 |
| Always | 渲染所有像素,等于AlphaTest Off |
| Never | 不渲染任何像素 |
Alpha测试的测试值是一个范围在0到1之间的浮点值,也可以是一个指向浮点属性或是范围属性的索引,在后一种情况下需要使用标准的方括号写法标注索引名字,如:[变量名]
许多游戏在渲染植物和树木时都有典型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 {
Material {
Diffuse [_Color] //设置漫反射光颜色
Ambient [_Color] //设置环境光颜色
}
Lighting On //开启光照
Cull Off //关闭剪裁
Pass {
AlphaTest Greater [_Cutoff] //进行Alpha测试
SetTexture [_MainTex] { //设置纹理
combine texture * primary, texture
}
}
Pass {
ZWrite off //像素深度不写入深度缓冲
ZTest Less //设置深度测试模式
AlphaTest LEqual [_Cutoff] //进行Alpha测试
Blend SrcAlpha OneMinusSrcAlpha //设置透明度混合
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
}
}
第一个Pass,它使用alpha测试仅仅去渲染那些半透明值大于0.5的像素。
第二个Pass,它使用alpha混合那些上次未渲染的部分,不再记录这些像素的深度。
提示
上面的代码在子着色器中做了一些设置,而不是在独立的通道中。所有在子着色器中做的设置将被当做其中的通道的默认设置。