unity用shader遮罩模拟黑夜火把照明效果
1、首先前期准备如下:一张地图,一张猪脚,一张纯黑的黑夜图,一张白色的光斑。
注意:光斑图片作为材质贴图使用,所以光斑占图片的大小一定要占图片大小的很小一部分。
2、然后在场景中将地图、猪脚、黑夜依次拖拽到场景中注意他们的层次,地图的order in layer 为0,猪脚为1,黑夜在最上方为2。这样场景了什么都看不见啦!一片漆黑。
3、不要着急,我们开始下一步,我们新建一个材质、一个shader,然后将shader拖拽给材质,将材质再拖拽给黑夜。
4、现在开始关键的一部,双击打开shader,我们开始进行简答编辑,思路是通过黑夜的贴图与光斑进行透明度计算来实现贴图在光斑处的透明度为完全透明。
真的很简单哦!
5、我们先来吧第一行代码“”里的名字改为“mask shader”
这个仅仅表示shader的外部显示名,没大意义。
我们看第三行
这个_MainTex就是主纹理了,“Base (RGB)"是也外部名字没多大意义,我们按他的格式添加一个贴图作为遮罩:
_Mask ("Culling Mask", 2D) = "white" {}
下面这个用来调整后期边缘的透明度:
_Cutoff ("Alpha cutoff", Range (0,1)) = 0.1
6、我们将SubShader中的tages改为:
Tags {"Queue"="Transparent"}
这个决定了渲染方式,是保证所有的不透明物体都会在半透明物体之前被渲染,简单的说就是我们可以进行透明度的渲染了。
7、然后我们删除tages到endcg里的内容,添加下面的代码:
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest GEqual [_Cutoff]
Pass
{
SetTexture [_Mask] {combine texture}
SetTexture [_MainTex] {combine texture,texture-previous}
}
里面的settexture就是进行纹理的设置了,
看 SetTexture [_MainTex] {combine texture,texture-previous}里面
逗号前的是颜色计算,后面的是透明度计算“combine texture”颜色维持原样,“texture-previous”是与上一句的计算结果进行减法计算,而我们上一句没有计算透明度,所以就是我们的主纹理“_MainTex”的透明度减去了遮罩光斑“_Mask”的透明度。
注意:这里透明度为0-255,0为完全透明所以不透明减去不透明就是0,就透明了,哈哈简单吧!
最后如下:
8、给猪脚加帧动画就是下面这样了
哈哈,就这样了
这一篇够长了,下一篇实现猪脚移动,照明效果也跟着移动。
unity 脚本控制材质偏移实现动态照明
http://jingyan.baidu.com/article/fa4125acd633e128ac70920f.html