AmplifyShader Fisheye

Fisheye, 魚眼,像凸透鏡的一種應用,查了一些資料後發現,關鍵字打 "Barrel Distortion " 比較恰當。下面單純就自己理解的幾種針對 2D Image 的魚眼製作方式來記錄與分享。

* 不免俗還是要說一下什麼是魚眼?


        ** 查到一些資料是這麼說的: 

                              一種光的折射現象,當光通過密度過大的物體 (如水或玻璃)時會發生折射,光會彎曲進而產生影像失真。但魚眼密度的差異變化是循序漸進的,沿著圓形圖案分布,這種結構使得光線緩慢地彎曲而不是折射,引導光線在透鏡中繞著完美的圓進行。

* 那魚眼的達成技術?

        ** 查到一些實踐技術: 
                              1. For 3D 圓形或半圓的,可以參考這些資料 → 點我點我
                              2. For 2D 圖像的,可以參考這些資料 點我點我點我

        ** 簡單來說,我們其實是要做到:
                              * 一個像 1 的數值分佈(0~1~0), 2 是原 UV ,1 對 2 做效果的疊加就換產生 3 的新 UV,所以關鍵在還有疊加的效果如何實踐

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

* Way 1. 簡化的數學式

    1.1  做出一個 (0~1~0) 的數值,以下舉兩種方式

        ** 仔細看會發現其實計算方式是差不多的,重點還是拋物線公式( y = x)。

 

    1.2  與原 UV 疊加的效果

        ** 在做出了一個二維區間在 0~1~0 的數值後(就是1.1),疊加效果的實踐就是取得原UV與 1.1相乘 ,但相乘前記得將取得的原UV做中心點的校正(Offset -0.5),然後再次取得原UV減去疊加後的效果就是最終的結果,參考下圖。


    **  最終的效果,左邊為使用 1.1 上圖效果,右邊為使用 1.1 下圖效果


 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

* Way 2. 較複雜的數學式,參考這篇  點我


    2.1  這邊直接對取得的 UV 做出已經疊加成魚眼的效果


    2.2  這部分重點在遮罩取得,配合 Lerp 來決定繪製 2.1 還是原UV

    **  最終的效果


-------------------------------------------------------------------------------------------------------------------------------------------------------------------

上面兩種方法的效果都略有差異,其實也沒哪個比較好,但可以確定的是複雜的應該比較耗效能.....XD 就看自己的需求與硬體的配備了。
         

留言

這個網誌中的熱門文章

UE4: Spine2D 導入與基本使用