Unity3D在NGUI中使用mask


過程是這樣的:最近一直想做一個頭像的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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM