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测试的硬边界。解决这个问题的办法是渲染这个物体两次。下面的着色器代码实现了此功能:

  1. Shader "Vegetation"
  2. Properties {
  3. _Color ("Main Color", Color) = (.5, .5, .5, .5)
  4. _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
  5. _Cutoff ("Base Alpha cutoff", Range (0, .9)) = .5
  6. }
  7. SubShader {
  8. Material {
  9. Diffuse [_Color] //设置漫反射光颜色
  10. Ambient [_Color] //设置环境光颜色
  11. }
  12. Lighting On //开启光照
  13. Cull Off //关闭剪裁
  14. Pass {
  15. AlphaTest Greater [_Cutoff] //进行Alpha测试
  16. SetTexture [_MainTex] { //设置纹理
  17. combine texture * primary, texture
  18. }
  19. }
  20. Pass {
  21. ZWrite off //像素深度不写入深度缓冲
  22. ZTest Less //设置深度测试模式
  23. AlphaTest LEqual [_Cutoff] //进行Alpha测试
  24. Blend SrcAlpha OneMinusSrcAlpha //设置透明度混合
  25. SetTexture [_MainTex] {
  26. combine texture * primary, texture
  27. }
  28. }
  29. }
  30. }

第一个Pass,它使用alpha测试仅仅去渲染那些半透明值大于0.5的像素。

第二个Pass,它使用alpha混合那些上次未渲染的部分,不再记录这些像素的深度。

提示

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

标签: Alpha测试

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号