Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器
Posted _Captain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器相关的知识,希望对你有一定的参考价值。
上一节中,利用纹理的 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
指定了 alphatest:_CutOff 之后,我们的着色器就变成了透明裁剪着色器。当片段的 Alpha 值 < _CutOff 的时候,该片段被抛弃。
2、将通道值 赋值给 O.Alpha
o.Alpha = c.r;
根据上面讲的,我以为工作流程是这样的
float _CutOff=0.5
O.Alpha = 纹理.R
if(O.Alpha < _CutOff)
DisCard()
但是查看Unity 生成的Shader 代码发现是使用了 Clip() 这个函数
框中的这一句
// alpha test
clip (o.Alpha - _CutOff);
clip(x) : 如果输入向量中的任何元素小于0,则丢弃当前像素。
也就是说,是通过 Alpha 值 减去 指定的 _CutOff ,也就是,Alpha 值 低于 _CutOff 的片段都会被丢弃。
根据书上所说,这次学习的 透明裁剪着色器,因为要逐像素判断 Alpha 是否小于 _CutOff ,所以是比较消耗 GPU的,所以在手机并不推荐。
但是在工作中,会发现,其实很大程度上都是一个度的问题。
像这中溶解效果,用在副本里面,不可能几十个怪同时死亡而同时显示溶解的效果的。
所以并没有什么在手机上就不能用这种事情。想用就用。
示例工程打包下载:
http://pan.baidu.com/s/1nvzpn2x
以上是关于Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器的主要内容,如果未能解决你的问题,请参考以下文章
Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器
Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器
Unity Shaders and Effects Cookbook (6-3) 修改渲染队列Queue 来 修改渲染顺序
Unity Shaders and Effects Cookbook (7-3) 在地形中使用顶点颜色做混合
Unity Shaders and Effects Cookbook (D-2) Cull Back背面剔除 -- 模型半边不可见
Unity Shaders and Effects Cookbook (5-1)LitSphere lighting model