上一节中,利用纹理的 RGB 通道值 作为灰度,来控制像素的透明度,这种方式叫做半透明着色器。
这一节学习透明裁剪着色器,仍然是读取 RGB 通道值,赋值给 alpha,然后指定一个固定值作为标尺,如果 alpha < 标尺,就抛弃这个片段,也就是裁减掉不显示。
这一次实现的效果如下图
适合作为怪物死亡的效果。
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
下面开始学习。
搭建好场景,新建Material,新建Shader。
Shader完整代码如下:
Shader "CookBookShaders/Chapt6-2/CutOff" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _CutOff("Cut Off",Range(0,1))=0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Lambert alphatest:_CutOff sampler2D _MainTex; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Alpha = c.r; } ENDCG } FallBack "Diffuse" }
1、在 #pragma 语句中指定了 alphatest:_CutOff
#pragma surface surf Lambert alphatest:_CutOff
2、将通道值 赋值给 O.Alpha
o.Alpha = c.r;
根据上面讲的,我以为工作流程是这样的
float _CutOff=0.5 O.Alpha = 纹理.R if(O.Alpha < _CutOff) { DisCard() }
框中的这一句
// alpha test clip (o.Alpha - _CutOff);
也就是说,是通过 Alpha 值 减去 指定的 _CutOff ,也就是,Alpha 值 低于 _CutOff 的片段都会被丢弃。
根据书上所说,这次学习的 透明裁剪着色器,因为要逐像素判断 Alpha 是否小于 _CutOff ,所以是比较消耗 GPU的,所以在手机并不推荐。
但是在工作中,会发现,其实很大程度上都是一个度的问题。
像这中溶解效果,用在副本里面,不可能几十个怪同时死亡而同时显示溶解的效果的。
所以并没有什么在手机上就不能用这种事情。想用就用。
示例工程打包下载:
http://pan.baidu.com/s/1nvzpn2x