過程是這樣的:最近一直想做一個頭像的mask效果,后來發現原來unity的mask需要用shader來寫,網上找了不少資料,也能實現,不過大多數都是用render texture作為相機投影的texture。然后把這個相機的圖像作為一個material,然后在ngui中創建一個texture,把這個material賦給texture。怎么說呢,這種方式雖然也能實現,但是必須要創建一個相機,對於一個大型項目來說有點不切實際。一個頭像加個mask多簡單的一件事,肯定有更好的辦法。
最終還是找到了一種很好的方法,這種方法更接近想象中的方法,廢話不多說了,跟我一步步做吧!
首先,我們需要新建一個shader。然后給他添加下面的代碼。
在project試圖中,右鍵->Create->Shader,新建一個shader,名字隨便。
Shader "Unlit/Transparent Colored with mask" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {} _AlphaTex ("Yeahyeah", 2D) = "white" {} } SubShader{ LOD 100 Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Pass { Cull Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 ColorMask RGB AlphaTest Greater .01 Blend SrcAlpha OneMinusSrcAlpha ColorMaterial AmbientAndDiffuse SetTexture [_MainTex] { Combine Texture * Primary } SetTexture [_AlphaTex] { Combine previous, texture } } } }
順便說下shader吧。太官方了可能不好理解,大概意思就是,在渲染的時候shader規定了某些規則,這些規則往往是用來實現某些炫酷的特效,或者為了某使些功能更高效。
代碼中的Properties相當於unity腳本中的公共變量,當把shader賦給某個material時這些變量就能想出來,你可以給他賦值 ,跟unity腳本基本一樣。
代碼中的SubShader是子渲染器,這里面就能訪問到前面設置的變量,這里主要是實現shader功能的地方,當然你還可以在這里面定義函數,等等,但是函數是用的一種叫Cg / HLSL的語言。
Pass,是渲染通道。這里可以設置一些參數來規定渲染方式。
好了基本就這樣,要想具體了解shader,看unity官方的解釋。
好了我們接着做mask。如果shader代碼能看懂的話,基本你也就會做了。
它主要做了兩件事:
1,給兩個texture賦值,其實就是兩張圖片。
2,把_AlphaTex中不透明的像素和_MainTex中的像素輸出,其實就相當在MainTex中摳出一個AlphaTex中不透明的那部分形狀一樣的圖塊。
其實剛開始我搜到了不少shader,很多都沒有提到怎么使用,下面來看一下
其實很簡單,點擊建好的shader在inspector面板中你會看到
從project視圖中把兩張圖片拖上去就可以了。
MainTex是你要顯示的圖片
AlphaTex是你要摳圖的形狀,注意這張圖除了形狀可以用任何顏色以外其他必須都是透明的,而且圖的大小要跟MainTex圖片一樣大。
最后就是使用了,用NGUI創建一個Texture,把shader拖到UITexture腳本的shader變量中,你會發現興奮的事情發生啦!!最終效果如下:
OK,就到這里了,gook luck!