【ShaderLab】時空斷裂效果

居然寫出來了就乓,沒想過能寫出來( post by 2018.5

效果

AntiEffect.gif

AntiEffect.shader

Shader "Custom/AntiTexture"

{
 Properties
 {
 _MainTex ("Texture", 2D) = "white" {}
 [Enum(Const,1,Gradient,2)] _RenderType ("Render Type", Int) = 1
 [Enum(AntiConst,1,AntiInverse,2)] _ColorType ("Color Type", Int) = 1
 _Radius ("Radius", Range(0, 10)) = 0.0
 _StartPos ("Start Position", Vector) = (0, 0, 0, 0)
 }
 SubShader
 {
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
?
 sampler2D _MainTex;
 half _Radius;
 fixed3 _StartPos;
 int _RenderType;
 int _ColorType;
?
?
 #include "UnityCG.cginc"
?
 struct a2v
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };
?
 struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 vertex : SV_POSITION;
 float3 worldPos : TEXCOORD1;
 };
?
?
 v2f vert (a2v v)
 {
 v2f o;
 o.vertex = UnityObjectToClipPos(v.vertex);
 o.worldPos = mul(unity_ObjectToWorld,  v.vertex);
 o.uv = v.uv;
 return o;
 }
?
 bool inRange(float3 pos)
 {
 return distance(pos, _StartPos.xyz) < _Radius;
 }
?
 fixed4 frag (v2f i) : SV_Target
 {
 fixed4 col = tex2D(_MainTex, i.uv);
?
 // improve performance
 if (_RenderType == 1)
 {
 if (_ColorType == 2)
 {
 col = 1 - col;
 }
 return col;
 }
?
 switch(_ColorType)
 {
 case 1:
 if (inRange(i.worldPos))
 {
 col = 1 - col;
 }
 break;
 case 2:
 if (!inRange(i.worldPos))
 {
 col = 1 - col;
 }
 break;
 }
?
 return col;
 }
 ENDCG
 }
 }
}

思路

復(fù)制粘貼在車上和旅館里用手機(jī)打的字:

想要實(shí)現(xiàn)的效果

全局?jǐn)嗔?效果

一開始是考慮這樣一個效果筋遭,從某個點(diǎn)(比如player的中心)開始生成一個逐漸變大的球,在球范圍內(nèi)的物體開始產(chǎn)生效果(比如反色)

直接效果

對于一些簡單的情況當(dāng)然是可以做到的桨武,比如物體A要被斷裂,判斷斷裂球是否與A碰撞锈津,從碰撞時在物體的shader傳入幾個參數(shù)(物體a的中心和斷裂中心以計(jì)算斷裂直線軌跡呀酸,還有斷裂傳播速度以獲取半徑),不過由于每幀要判斷頂點(diǎn)或片元是否處于斷裂球內(nèi)琼梆,這樣shader的計(jì)算量會變得相當(dāng)大性誉,可能會遇到一個性能瓶頸。

還有一個問題茎杂,如果只是簡單的貼圖shader還好错览,對于本身shader就很復(fù)雜的物體改寫shader也是一件很痛苦的事情』屯或者說構(gòu)建很復(fù)雜的物體蝗砾,比如一個簡單的人物模型上面就有幾十幾百個子物體,要這樣全部改一遍根本不可能。

而且material和shader是多對一的關(guān)系悼粮,基本上就告別共用material了闲勺。(后記:對于Unity來說,shader即材質(zhì)扣猫,沒有更換shader的說法

間接效果

還有一個更加簡單的辦法菜循,就是使用屏幕后處理。由名思義就是在所有渲染完成申尤,呈現(xiàn)最終屏幕上的最終效果后癌幕,再進(jìn)行最終的處理。

這樣就簡單了昧穿,因?yàn)橹皇翘幚硪粋€tex2d勺远,只要傳入一個平面坐標(biāo)和擴(kuò)散速度,這個shader寫起來就沒有任何難度可言时鸵。但是這樣做就不好控制深度問題胶逢,比如我不想影響被A擋住的B,但是不可能饰潜,因?yàn)橄绕聊缓筇幚碓黉秩綛的話會出現(xiàn)詭異的位置情況初坠。

AntiScreen.gif

(補(bǔ)個圖)

這大概就是一個取舍問題。

無論如何彭雾,直接效果還是需要進(jìn)行實(shí)驗(yàn)的碟刺,大致進(jìn)度如下:(回去用那個貓模型為例)

反色材質(zhì)shader → 動態(tài)反色材質(zhì)shader → 加上觸發(fā)器 → 加上傳入?yún)?shù)功能

(然后摸了一周)

這是寫完后的想法:

構(gòu)思這個東西斷斷續(xù)續(xù)大概花了一周的時間,雖然一個很簡單的想法薯酝,但是寫起來不知道為什么那么痛苦半沽。特別是shader的Debug,因?yàn)閟hader幾乎沒有Debug的方法吴菠,只能憑經(jīng)驗(yàn)判斷是哪里出了錯者填。而且shaderlab對于初學(xué)者極不友好,我是在讀了大概不知道多少個例子(而且是很陳舊的例子)之后橄务,在腦子中推斷語法幔托,還要時時刻刻考慮性能問題。上面的代碼我給出了一個_RenderType蜂挪,從而在非碰撞時重挑,設(shè)計(jì)一個能夠跳過片元著色器的邏輯判斷的分支。

擴(kuò)展閱讀

感謝下列文章棠涮,雖然無法根本解決問題谬哀,但是為我提供了寶貴的思考價值:

【鏈接】UnityShader使用枚舉切換整體色調(diào)https://blog.csdn.net/chy555chy/article/details/79065485

【鏈接】【貓貓的UnityShader之旅】之使用頂點(diǎn)的世界坐標(biāo)https://blog.csdn.net/dbtxdxy/article/details/45679371

【鏈接】unity幾種優(yōu)化建議https://blog.csdn.net/ElyXiao/article/details/51980863

以及《Unity Shader入門精要》,從附帶的代碼中解決了我絕大多數(shù)的困惑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末严肪,一起剝皮案震驚了整個濱河市史煎,隨后出現(xiàn)的幾起案子谦屑,更是在濱河造成了極大的恐慌,老刑警劉巖篇梭,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氢橙,死亡現(xiàn)場離奇詭異,居然都是意外死亡恬偷,警方通過查閱死者的電腦和手機(jī)悍手,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袍患,“玉大人坦康,你說我怎么就攤上這事」钛樱” “怎么了滞欠?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵补胚,是天一觀的道長改鲫。 經(jīng)常有香客問我,道長音比,這世上最難降的妖魔是什么妖滔? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任隧哮,我火速辦了婚禮桶良,結(jié)果婚禮上座舍,老公的妹妹穿的比我還像新娘。我一直安慰自己陨帆,他們只是感情好曲秉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疲牵,像睡著了一般承二。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲爸,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天亥鸠,我揣著相機(jī)與錄音,去河邊找鬼识啦。 笑死负蚊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颓哮。 我是一名探鬼主播家妆,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冕茅!你這毒婦竟也來了伤极?” 一聲冷哼從身側(cè)響起蛹找,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哨坪,沒想到半個月后庸疾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡当编,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年彼硫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凌箕。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡拧篮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牵舱,到底是詐尸還是另有隱情串绩,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布芜壁,位于F島的核電站礁凡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慧妄。R本人自食惡果不足惜顷牌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塞淹。 院中可真熱鬧窟蓝,春花似錦、人聲如沸饱普。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽套耕。三九已至谁帕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冯袍,已是汗流浹背匈挖。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留康愤,地道東北人儡循。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像翘瓮,于是被迫代替她去往敵國和親贮折。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容