shader遮罩利用alhpa通道改變紋理的區域透明度,添加多層貼圖就可以實現紋理多個區域不同的透明情況。
結果如下圖所示:
我們說一下如何實現,當然看這篇之前最好先看看這篇:
unity用shader遮罩模擬黑夜火把照明效果
/shuma/1859561sbl.html
工具/原料
一臺電腦
unity4.0
unity用shader遮罩模擬黑夜火把照明效果/shuma/1859561sbl.html
方法/步驟
首先在場景中放幾個火盆,隨便你想放幾個。當然這裡放幾個,後面shader裡就需要幾張遮罩貼圖。這裡我們放倆個火盆。
我們在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
i++;
}else
{
i=0;
}
renderer.material.SetTexture("_Mask",mask[i]);
renderer.material.SetTexture("_Mask0",mask[i]);
renderer.material.SetTexture("_Mask1",mask[i]);
}
原理就是循環一組大小不同的的光圈圖片作為遮罩的貼圖,具體在
unity 貼圖動畫實現照明忽大忽小
/shuma/1859864cnu.html
裡面說過,就不詳細說了。
最終腳本如下圖:
OK,最終效果如下圖,很不錯吧!