Unity3d Shader开发(三)Pass(Alpha testing )
透明度测试是阻止像素被写到屏幕的最后机会。

在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会被写到显示输出中。
Syntax 语法
- AlphaTest Off
 - 渲染所有像素(缺省)
 - AlphaTest comparison AlphaValue
 - 设定透明度测试只渲染在某一确定范围内的透明度值的像素。
 
Comparison 对照表
比较下列词语:
| Greater | Only render pixels whose alpha is greater than AlphaValue. 大于 | 
| GEqual | Only render pixels whose alpha is greater than or equal to AlphaValue. 大于等于 | 
| Less | Only render pixels whose alpha value is less than AlphaValue. 小于 | 
| LEqual | Only render pixels whose alpha value is less than or equal to from AlphaValue. 小于等于 | 
| Equal | Only render pixels whose alpha value equals AlphaValue. 等于 | 
| NotEqual | Only render pixels whose alpha value differs from AlphaValue. 不等于 | 
| Always | Render all pixels. This is functionally equivalent to AlphaTest Off.  渲染所有像素,等于关闭透明度测试AlphaTest Off  | 
| Never | Don't render any pixels. 不渲染任何像素 | 
AlphaValue
一个范围在0到1之间的浮点值。也可以是一个指向浮点属性或是范围属性的索引,在后一种情况下需要使用标准的方括号写法标注索引名字,如([变量名]).
Details 细节
在这个图形中,左边的树使用透明度测试。注意在它的图形上的像素是如何完全透明或不透明。中间的树只使用透明度混合来渲染-注意由于深度缓冲的缘故靠近分支的透明部分是如何覆盖更远的叶子。右边的树是通过后续的例子着色器渲染的 - 实现了通过混合和透明度测试的组合隐藏了人工的痕迹。

最简单的能用的例子,使用一张带有透明度通道的纹理。对象只会在透明度大于0.5 时显示
Shader "Simple Alpha Test" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    }
    SubShader {
        Pass {
            // Only render pixels with an alpha larger than 50%
            // 只渲染透明度大于50%的像素
            AlphaTest Greater 0.5
            SetTexture [_MainTex] { combine texture }
        }
    }
}

这并不是非常好。让我们增加一些光照和并调整剪切值:
Shader "Examples/Self-Illumination 2" {
    Properties {
        _IlluminCol ("Self-Illumination color (RGB)", Color) = (,,,)
        _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Set up basic white vertex lighting
            Material {
                Diffuse (,,,)
                Ambient (,,,)
            }
            Lighting On
            // Use texture alpha to blend up to white (= full illumination)
            SetTexture [_MainTex] {
                // Pull the color property into this blender
                // 使颜色属性进入混合器
                constantColor [_IlluminCol]
                // And use the texture's alpha to blend between it and
                // vertex color
                // 使用纹理的alpha通道混合顶点颜色
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}

当渲染树和植物时,透明度测试使许多游戏中出现尖锐的边缘。解决这个问题的方法之一是渲染对象两次。首次通道中,我们只渲染超过50%透明度的像素。在第二次通道中,我们使用透明度混合上次我们切除的部分,而不记录像素的深度。我们可能会使得一些源的树枝覆盖近的树枝,但实际情况中,当叶子有大量的视觉细节时很难看出这样的缺陷。
Shader "Vegetation" {
    Properties {
        _Color ("Main Color", Color) = (., ., ., .)
        _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
        _Cutoff ("Base Alpha cutoff", Range (,.)) = .
    }
    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
        //第一步 渲染所有超过[_Cutoff] 不透明的像素
        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
            }
        }
    }
}

Unity3d Shader开发(三)Pass(Alpha testing )的更多相关文章
- Unity3d Shader开发(三)Pass(Culling & Depth Testing)
		
剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施.所有几何体都包含正面和反面.剔除基于大多数对象都是封闭的事实:如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因 ...
 - Unity3d Shader开发(三)Pass(Pass Tags,Name,BindChannels )
		
Pass Tags 通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果. Syntax 语法 Tags { "TagName1" = "Value1&qu ...
 - Unity3d Shader开发(三)Pass(Blending )
		
混合被用于制作透明物体. 当图像被渲染时,所有着色器被执行以后,所有贴图被应用后,像素将被写到屏幕.他们是如何通过Blend命令的控制和已有的图像合并呢? Syntax 语法 Blend Off Tu ...
 - Unity3d Shader开发(三)Pass(Texturing )
		
纹理在基本的顶点光照被计算后被应用.在着色器中通过SetTexture 命令来完成. SetTexture 命令在片面程序被使用时不会生效:这种模式下像素操作被完全描述在着色器中. 材质贴图可以用 ...
 - Unity3d Shader开发(三)Pass(Color, Material, Lighting )
		
材质和灯光参数被用于控制内置顶点光照.顶点光照是Direct3D/OpenGL标准的按每顶点计算的光照模型.光照打开时,光照受材质块,颜色材质和平行高光命令的影响. 每像素光照常被实现为自定义顶点/片 ...
 - Unity3d Shader开发(三)Pass(Fog )
		
雾参数用于雾命令控制. 雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的一个不变色来完成.雾化不会改变已经混合的像素的透明度值,只是改变RGB值. Syntax 语法 Fog { Fog C ...
 - Unity3d Shader开发(四)UsePass ,GrabPass ,SubShader Tags
		
(一)UsePass 命令 使用 来自另一个着色器的命名通道. Syntax 语法 UsePass "Shader/Name" 插入所有来自给定着色器中的给定名字的通道.Shade ...
 - Unity3d Shader开发(二)SubShader
		
(1)SubShader Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 当Un ...
 - Unity3d Shader开发(五)Fallback ,Category
		
Fallback定义在所有子着色器后.简单来说,它表示"如果没有任何子着色器能被运行在当前硬件上,请尝试使用降级着色器". Syntax 语法 Fallback "nam ...
 
随机推荐
- linux vi 撤销重做于前进后退--转
			
在vi中按u可以撤销一次操作 u 撤销上一步的操作Ctrl+r 恢复上一步被撤销的操作 注意:如果你输入“u”两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容模式了.重做如果你撤销得太多 ...
 - 命令行界面下的用户和组管理之useradd和passwd命令的使用
			
命令行界面下的用户和组的管理之useradd和passwd命令的使用 useradd [-c comment] [-d dir] [-e expire] [-g group] [-G group1,g ...
 - IE6 BUG margin 两倍
			
触发条件: 父元素包含子元素 子元素设置了浮动(float) 子元素设置了外边距(margin) 浮动方向和边距方向一致 解决方案: 给该子元素添加 display:inline;
 - 抽象(abstract)升级版变接口(interface)     继承(extends)升级版叫实现(implements)    升级版啊升级版   接口可以多继承
			
Client --------------------------------------------------- public class Client{ public static void m ...
 - 20160515-hibernate--事务
			
事务 JDBCTransaction 单个数据库(一个SesisonFactory对应一个数据库),由JDBC实现. Session session = null; Transaction tx =n ...
 - 异步请求---Get
			
前端 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &l ...
 - SecureCRT 7 注册码
			
Name: Sherrill Ray Company: 空 Serial Number:03-40-084141 License Key: ABWGUE ZPPZ6X XHTN2S 1N7PER A ...
 - Hudson的安装配置
			
Hudson的安装配置 目录 一.正文... 2 1.安装配置jdk. 2 2.安装配置tomcat7. 2 3.安装Hudson. 2 4.启动tomcat. 2 5.初识Hudson. 3 6 ...
 - 12天学好C语言——记录我的C语言学习之路(Day 1)
			
12天学好C语言--记录我的C语言学习之路 Day 1: 刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program 1.1): /*//program 1.1 ...
 - 用pelican搭建完美博客
			
前面有文章介绍本站采用了Python编写的Pelican静态生成博客系统, 之所以没有使用当前很火的Jekyll, 是因为它是Ruby编写, 而我又对Ruby没有啥兴趣, 所以还是选择了使用了我熟悉的 ...