学习shader也有一段时间了,但由于只注重理论,而不注重实践,所以当想要写一个shader时,往往无从下手。眼看着大神们写出了各种华丽的shader,本人的心中真是百感交集啊!于是近段时间终于下定决心,重新学习了shader。关于shader的基础教程,个人认为比较好的是《猫都能学会的Unity3D Shader入门指南》系列、浅墨的shader教程以及《unity4.x从入门到精通》中shader的那一章。


好了进入正题。现在要研究的是遮罩shader的书写,本文章主要参考了这里,为了方便学习,这里先给出一个简化版的遮罩shader。


Shader "Transparent/Mask"  
{  
	Properties
	{
		_MainTex("Base (RGB)", 2D) = "white" {}
		_Mask("Culling Mask", 2D) = "white" {}
		_Cutoff("Alpha Cutoff", Range(0, 1)) = 0.1
	}
	SubShader
	{
		Pass
		{
			AlphaTest GEqual[_Cutoff]
			SetTexture[_Mask] {}
			SetTexture[_MainTex] {combine texture, previous}
		}
	}
}



这是制作小地图需要用到的两张图片,一张是小地图,另一张是中心为黑圆,其余为透明的png图片。

Unity 遮罩去毛边_Mask

Unity 遮罩去毛边_Unity 遮罩去毛边_02


好了接下来我们来分析一下shader的代码。AlphaTest GEqual[_Cutoff]的意思是alpha(透明度)的值大于等于_Cutoff时像素才会被渲染,否则不会被渲染。因为黑圆之外的像素是透明的,alpha值为0,所以当_Cutoff大于0时,黑圆之外的像素就不会被渲染,只有黑圆里的像素才会被渲染,显示为一个黑圆。


这是注释了pass通道的第三行代码的结果(因为黑圆图片有些问题,所以本人用白圆图片代替):

Unity 遮罩去毛边_shader_03

这是注释了pass通道的第一、三行代码的结果(因为黑圆图片有些问题,所以本人用白圆图片代替):

Unity 遮罩去毛边_shader_04

好了现在我们分析一下我们想要的小地图的效果:圆内显示小地图,圆外透明。即是这样的一种效果:

Unity 遮罩去毛边_Mask_05

所以关键就是pass通道的第三行代码了。texture指的是SetTexture中被定义的纹理,previous指的是上一次SetTexture的结果;第一个参数操作的是rgb值,第二个参数操作的是alpha值,所以整句代码的意思就是,最终图像的rgb使用小地图的rgb值,最终图像的alpha使用遮罩图的alpha值。因此就出现了上图的效果。。