Alpha测试

作者:追风剑情 发布于:2014-6-1 16:52 分类:Shader

   透明度测试是阻止像素被写到屏幕的最后机会。在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会写到显示输出中。常用语法如下。

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混合那些上次未渲染的部分,不再记录这些像素的深度。

提示

   上面的代码在子着色器中做了一些设置,而不是在独立的通道中。所有在子着色器中做的设置将被当做其中的通道的默认设置。

标签: Alpha测试

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号