我们在shader中添加三张贴图来做遮罩,猪脚一张、火盆三张,分别为
_Mask ("Mask", 2D) = "white" {}
_Mask0 ("Mask0", 2D) = "white" {}
_Mask1 ("Mask1", 2D) = "white" {}
在纹理混合中进行如下设置:
SetTexture [_Mask] {combine texture}
SetTexture [_MainTex] {combine texture,texture-previous}
SetTexture [_Mask0] {combine previous,previous-texture}
SetTexture [_Mask1] {combine previous,previous-texture}
SetTexture 的原理在
unity用shader遮罩模拟黑夜火把照明效果
中有说过,这里就不详细说了
总之就是将上一步计算的的alpha通道值减去这张贴图的alpha通道值就是了。
保存一下,回到我们的主界面,将我们的遮罩贴图拖到三个子贴图中,
但是这样场景中只看到了一个光圈。
我们把他的offset都偏移一下,这样三个就齐了。
将光圈对准火盆与光圈跟随猪脚移动原理一样。
下一步让光圈移到火盆处。
我们打开脚本,
脚本中添加:
public GameObject fire
public GameObject fire0
然后按照获得俩火盆的位置:
float firex = fire.transform.position.x
float firey = fire.transform.position.y
float fire0x = fire0.transform.position.x
float fire0y = fire0.transform.position.y
然后就是根据火盆的位置获得遮罩的偏移量:
float offsetfirex=-firex/(Le*2f)
float offsetfirey=-firey/(Wi*2f)
float offsetfire0x=-fire0x/(Le*2f)
float offsetfire0y=-fire0y/(Wi*2f)
最后是改变遮罩的位置:
renderer.material.SetTextureOffset ("_Mask0", new Vector2 (offsetfirex,offsetfirey))
renderer.material.SetTextureOffset ("_Mask1", new Vector2 (offsetfire0x,offsetfire0y))
OK,回到场景运行,测试一下效果不错:
我们最后让火盆的光圈也能和猪脚一样忽大忽小:
我们在如图所示脚本位置添加:
renderer.material.SetTexture("_Mask0",mask[i])
renderer.material.SetTexture("_Mask1",mask[i])
具体脚本如下:
f(Time.time>b){
b=b+c
if(i<mask.Length-1){
i++
}else
{
i=0
}
renderer.material.SetTexture("_Mask",mask[i])
renderer.material.SetTexture("_Mask0",mask[i])
renderer.material.SetTexture("_Mask1",mask[i])
}
原理就是循环一组大小不同的的光圈图片作为遮罩的贴图,具体在
unity 贴图动画实现照明忽大忽小
http://jingyan.baidu.com/article/72ee561a58724ae16138df25.html
里面说过,就不详细说了。
最终脚本如下图:
OK,最终效果如下图,很不错吧!
其实是利用UI层的Mask实现遮罩,有些不同的是Mask的图片是用Camera渲染到RenderTexture动态产生的纹理实现的。大概步骤如下:
1 分层渲染,建立Mask蒙版层。
2 河流设置为Mask层。
3 建立Mask Camera,只渲染Mask蒙版层
4 创建脚本MatchScreenRenderTexture,创建与窗口匹配的RenderTexture,令Mask Camera渲染到该RenderTexture中。
5 创建脚本MaskScript,建立一个MaskShader(类似于全屏特效),令MaskCamera渲染的颜色部分背景部分透明变成不透明,即反转Alpha。
6 建立UI Image。设置Image为窗口大小,设置使用MatchScreenRenderTexture中的蒙版纹理。
7 添加Mask组件,令Image遮罩住船精灵的部分。
ImageEffect MaskScript:
[csharp] view plain copy
using UnityEngine
using System.Collections
[ExecuteInEditMode]
CSDN个人博客地址凯尔八阿哥专栏 http://blog.csdn.net/zhangxiao13627093203 ,和蛮牛同步发表。首先要说一下问题:+高通Vuforia实现增强现实的应用时候,是不能现实出阴影的。参考了网上的一个帖子做的非常好,而且实现步骤写的也非常详 http://dev.arinchina.com/unity3dwz/ar6298/6298/
,如果没有注册这个网站的可以点作者的个人博客: http://mec0825.net/blog/?p=126 。
而我接下来要将的还有一个要实现的效果也是基于这个例子的启发的灵感,首先还是一样描述一下问题:效果图如图
实现的效果就是一个龙从墙上(标志点Mark是一个画有龙背景),喷火而出。这当然是最终的效果啦,刚开始的时候是这样的
前面上出现了后面的龙的翅膀,如果要做到真实的感觉是,龙从墙里面钻出来,而不是从墙板上充气式的浮起来了,所以应该把这两个翅膀给遮住,另外后面的贴图也不能被侧面看到,而只能通过这个破铜看到才有立体的效果,因为背景只是一个贴图,从侧面你看的话就成了一个片。
这样就要有四个透明的Mask遮罩遮住后面的场景,而保障只能通过这个破洞看到后面的场景。
上下左右添加一个Plane然后给每一个Plane赋给如下一段Shader的材质就可以了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)