三言兩語說shader(七)黑幕擴散

2021-07-11 02:15:53 字數 1372 閱讀 9567

按計畫繼續,目前為止寫了三篇對工程已有shader的分析解讀,當然實際上我讀的shader遠不止這三個啦,比如這週就把樂樂同學的blog裡的幾十篇文章泛泛通讀了一遍,主要也是為自己開始構思寫一些簡單的shader作準備,所謂「思而不學則殆」,不多看些別人的東西自己就想搞創作明顯是要吃虧的。

所謂「黑幕擴散」,就是一開始螢幕全黑,然後從中心向外逐漸展示出遊戲畫面。

為什麼我要做這麼乙個東西呢?一是它想來比較簡單。二是去年這個時候,乙個ui妹子提出了這個需求,我那時哪懂什麼shader咯,只好想了個笨辦法,找她要了張中間挖了乙個圓孔的黑圖,貼麵片上,放攝像機前面,然後用擴大麵片尺寸的方法,好歹也給實現了,哈哈,這當然很蠢。

現在我是具備這個能力了,可惜妹子也早已離職。

廢話不多說,開工。

shader是能利用內建的time變數通過取模方式在時間跨度上做一些動畫效果的,比如那些uv動畫、滾動的波浪、跳動的心之類的。

我的想法是在之前黑屏shader的基礎上加個半徑屬性,使半徑圓內不黑掉即可。

試了下是可行的,hlsl有個內建函式distance,然後螢幕中心點借用unity提供的內建引數_screenparams即可。**如下:

shader "myshader/blackscreenspread" 

_radius("viewradius", float) = 0.0

}subshader

else

}endcg}}

fallback off

}

注意這裡用了if else這種流程控制語句,因為我查了下cg/hlsl是支援這些流程控制關鍵字的,所以就試了下。

但我們會發現別人的shader中基本看不到if,傳說這種寫法效率極低,具體怎麼回事去網上可以搜到相關解釋。

不使用if的計算方法肯定是有的,不過我就暫時偷個懶不深究了。

另外在unity editor中圓的中心往往和畫面中心有偏差,具體原因我也不深究了,反正發布了乙個android包實機測試畫面是正確的。

效果如下:

外部控制指令碼加個radius變數更新下就好了,這裡也略過。

另外通過這次實驗我發現頂點經過mvp變換後,pos的xy確實已經是螢幕的畫素座標了,而且座標原點在左上角,往右是x軸正向,往下是y軸正向。

最後扯點別的,因為我unity重新安裝過,這次為了用unityremote看實際效果,又裝了次jdk和android sdk,好像unity5.0後就要多設定乙個jdk路徑了,我設了好久都說路徑無效,後來把jdk重新裝在c盤而不是原來的d盤就沒問題了,真是坑。

unityremote最終還是不能使用,有誰還在用的可以告訴我一聲。

三言兩語說shader(九)鑽石

這次的目標是繪製一顆閃閃發光的鑽石,追求效果是越接近真實越好。先說說為此我這幾天幹了些什麼。1.看了stalendp blog裡那篇 鑽石效果 後頭的參考文獻 最有價值的就是ati在2004年gdc上作的演講,題目就叫drawing a diamond。但是由於只有ppt,所以很難重現工程深入學習。...

三言兩語說shader(八)牆體透明

很抱歉這篇文章要放個空彈。計畫寫 牆體透明 的原因,也是工程實際需要,攝像機固定側視主角,但場景是真3d的,所以有時主角會被牆擋住,這時要作一些處理。之前用過一種直接讓人物變色顯示的方案,但效能損耗嚴重,具體原因我還沒分析。個人覺得讓牆體變透明的方案觀感效果可能更好。unity 牆遮擋人物時變為半透...

三言兩語 數學與哲學

起這個話題,是因為看到 中國哲學狂人挑戰世界頂級數學難題四色猜想 為此sohu還作了專題爭鳴。哲學和數學都是人類的基礎科學,古代的大數學家同時也是哲學家,比如 柏拉圖和亞里斯多德。亞里斯多德很早就認為 數學研究的物件是從物理實體上面所引出來的抽象觀念。所以我們可以從接受不存在的負數,到更難理解的虛數...