码迷,mamicode.com
首页 > 编程语言 > 详细

Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器

时间:2016-05-07 07:14:59      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

上一节中,利用纹理的 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) 透明裁剪着色器

标签:

原文地址:http://blog.csdn.net/huutu/article/details/51331185

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!