[Shader]NGUI與粒子系統

版權所有,轉載須註明出處!
喜歡火影、喜歡Java、喜歡unity3D、喜歡遊戲開發的都可以加入木葉村Q羣:379076227

1、前言
在很久很久以前,流傳着在NGUI中使用unity3D自帶粒子系統的方法。
有一種稱爲RenderQ,另一種稱爲Render Texture。
然而,或許是隨着歷史的原因,有些已經逐漸被人們淡忘。使用方法隨着應用的條件不同或殘缺不全,或效果錯誤。
我,不相信命運,踏上了找尋遺失祕法的旅途。最後,終於在某一天,遇見了。。。

2、遇見故友
友:來來,剛好見到你,問問你,NGUi中怎麼使用粒子?我:不是用代碼設置下粒子的RenderQ就可以了嗎?
友:那個太簡單了,網上都能搜索到,有什麼意思的?
我:那使用Render Texture來渲染出一個圖片,然後用UITexture來引用也可以吧。
友:我也想到這樣,但是不知道爲什麼攝像機看到的效果和UITexture用了這個Texture之後效果不對。
我:怎麼個不對?
友:你看看調試效果和實際運行效果
 

我:這效果確實不太一樣。不過也倒是有另一種美。
友:你給我滾出去
我:於是乎。我就走了。我邊走邊想。上面的效果圖有什麼問題?首先,背景是藍色的。我得先着手解決這個。

那不容易。這個一看就是攝像機的顏色。搞一搞。
 

我:你看,是不是這個效果。
友:是啊,怎麼搞的。
我:把渲染粒子的攝像機的背景顏色改成完全不透明的,然後選擇和當前顏色一樣。
友:你給我滾出去。。
我:不能這樣嗎。。爲啥不能呢。你看我這樣搞。。額。。確實好像不能。。

 

我:我得再想想。那如果把攝像機的背景調透明呢。
 

粒子居然完全看不到了。。

3、再重新整理下思緒
顯然,不管攝像機的背景是什麼顏色,都不能直接把渲染出來的texture放到UITexture上面。
那麼我們是否可以自己寫個shader。專門用於這種場景。
話不多說,我立馬寫了“Unlit - Particle”、“Unlit - Particle 1”、“Unlit - Particle 2”、“Unlit - Particle 3”這4個Shader。
這裏給出Unlit - Particle的代碼,(其他幾個的代碼在本文最後的項目中有)
[C] 純文本查看 複製代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Shader "Unlit/Particle"
{
        Properties
        {
                _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}
        }
         
        SubShader
        {
                LOD 100
 
                Tags
                {
                        "Queue" = "Transparent"
                        "IgnoreProjector" = "True"
                        "RenderType" = "Transparent"
                }
                 
                Cull Off
                Lighting Off
                ZWrite Off
                Fog { Mode Off }
                Offset -1, -1
    Blend One OneMinusSrcAlpha
 
                Pass
                {
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                                 
                        #include "UnityCG.cginc"
         
                        struct appdata_t
                        {
                                float4 vertex : POSITION;
                                float2 texcoord : TEXCOORD0;
                                fixed4 color : COLOR;
                        };
         
                        struct v2f
                        {
                                float4 vertex : SV_POSITION;
                                half2 texcoord : TEXCOORD0;
                                fixed4 color : COLOR;
                        };
         
                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                                 
                        v2f vert (appdata_t v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.texcoord = v.texcoord;
                                o.color = v.color;
                                return o;
                        }
                                 
                        fixed4 frag (v2f i) : COLOR
                        {
                           fixed4 col;
                                 col = tex2D(_MainTex, i.texcoord);
                                 col.a = col.rgb;
                           return col;
                        }
                        ENDCG
                }
        }
 
        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
      Blend One OneMinusSrcAlpha
                        ColorMaterial AmbientAndDiffuse
                         
                        SetTexture [_MainTex]
                        {
                                Combine Texture * Primary
                        }
                }
        }
}


最後測試圖:
 

1.png (440.42 KB, 下載次數: 0)

下載附件  保存到相冊

15 分鐘前 上傳



倒數第二列是放在UIPanel中的。最後一列則是放在Softclip的UIPanel中。
有時候可能會出現粒子有黑邊的情況。這個情況是因爲我們現在用的是渲染圖的RGB來算Alpha。因此沒辦法完全還原真實圖像。只能大家根據實際對shader進行調整。這個會根據粒子顏色的不同和背景的不同場景不同結果。
可以想象一下,就像你在Photoshop中,有一張RGB圖片。然後你想根據他的灰度扣除圖片。是沒辦法通過算法直接扣除的,只能是人眼的識別去調參數扣。

4、那麼最後奉上本文的測試工程。
大家想要把這個應用到自己項目的話,只需要工程中的幾個shader

 

下載地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章