1. 程式人生 > >Unity3D Compute Shader 晉級 網格模擬與奶茶泡泡【四】

Unity3D Compute Shader 晉級 網格模擬與奶茶泡泡【四】

Unity3D Compute Shader 晉級 網格模擬與特效【四】

1.每一個不曾舞蹈的日子,都是對生命的辜負….
2.Compute Shader對於她自己來說,所有能實現的效果只是冰山一角

Compute Shader Show

  • 難以信服的網格拼湊的圖片
    這裡寫圖片描述
    以前是點拼湊的圖片,現在是網格了,信不信拉倒。。。

  • 扭曲網格,讓你信一信
    這裡寫圖片描述
    喲!這就不好意思了,我不是惡意的,,,喲,你看,還能笑。。。
    (不知有沒有惡意,圖片來自獵豹wifi軟體中的)

  • 奶茶泡泡,我反正是信以為真了
    這裡寫圖片描述
    喝完了奶茶,就要吹個奶茶泡泡啊!快吹一個,你看真的變大了。。。
    這裡寫圖片描述
    最後吹成這樣了,你們猜,它是爆了,還是幹嘛了。。。

讓眼見成為現實的祕密

  • 網格實現起來是朵麼難
    這裡寫圖片描述
    實驗到這兒,說明已經成功了,說明每個網格的確是一個網格一張圖。
  • 怎麼畫網格,就是那個小方塊
    就是這個,Vertor3[]包含了方塊點的位置
    這裡寫圖片描述
    不過,你注意沒有,裡面有兩個點重複了,如果把它們按照順序在紙上連起來,你就知道這畫方塊的原理了,其實就是2個三角形的組合。

    當然,你得這樣儲存到buffer中,我要繪製它。。。。、、、、
    這裡寫圖片描述

    這是畫的效果,這兒其實一看畫了一張圖,其實所有的圖都重疊在一起了,
    這裡寫圖片描述
    如果你不信,那麼在你嘗試的時候,如果你在camera離圖近的時候會有卡頓,如果你又有充分的經驗的話,那是face的重疊造成的,這兒很關鍵,重疊是非常耗效能的。

  • 畫出其他效果
    這兒是我的發揮了,其他神馬的效果都可以做出來
    這裡寫圖片描述

  • 技術的革新儲存每個畫素到每個網格
    這裡寫圖片描述
    如果你做過vertex fragment shader的話,發現能輕鬆從模型資料中獲得uv座標,
    但那個問題就來了,這兒沒有任何神馬模型資料,而是存世界座標??????

    如果你的第一想法是,虛擬模型空間,像這樣的話:
    這裡寫圖片描述
    你會發現,這是多麼痛苦的事情。。。。。

    所以這兒我採用了一種我自己發明的Compute Shader 模型UV繫結法
    就是這樣
    這裡寫圖片描述
    能夠順利在世界座標中繫結,其理由是,我喜歡在ComputeShader中計算物理效果。。。
    這裡寫圖片描述
    不過你可以改為UNITY_MATRIX_MVP,這樣雖然感覺UNITY_MATRIX_MVP做了虛擬模型空間,但以後你就知道了,做其它複雜效果就會鬧出翔。。。。

    最後Compute Shader 模型UV繫結法的效果
    這裡寫圖片描述

特別技術

  • Instance 例項化
    說起例項化,其實是個非常棒的革新,讓GPU省了許多重複操作的事情。。
    這裡寫圖片描述
    上圖中的number 即為例項化的資料。。。。可想而知你自己試了才知道,同時對比效能分析
    這裡寫圖片描述
    如果前面都知道了,網格的重疊,那麼這兒的紅線處就是為了什麼???

    我當時就沒有數過來,你可以算啊,不是有計算器麼
    這裡寫圖片描述
    可想而知,這之前得重複了多少張。。。。

  • 物理效果之奶茶泡泡
    這裡寫圖片描述

    估計最神奇之處就是這兒的奶茶泡泡,如果是這樣的話,那麼前面的技術都是百搭了???

    不是說過了麼?Compute Shader中做運算才是發揮GPGPU的魅力之處
    這裡寫圖片描述
    不過這種魅力是基於矩陣級思想,有時不能以CPU的思想來玩程式碼。。不然那一坨管線都不知重複了同一種指令。

程式碼是最誠實的,也是最有權威的

  • Use in C#
    這裡寫圖片描述
    這裡寫圖片描述

  • Use in Compute Shader
    這裡寫圖片描述

  • Use in Shader
    這裡寫圖片描述

我們說說話吧

1.我覺得Compute Shader什麼都可以做,實時運算才是未來所要的。
2.當然其實不一定要用Verctor3[]來程式碼繪製網格,可以用mesh來獲得外部的模型資料。
3.我可以想象,它的價值不侷限於這兒的奶茶泡泡。。。。。