前往
大廳
主題 達人專欄

(Unity + Shader)Reflection Probe,製作動態環境與鏡面反射的水(下篇)

%%鼠 拒收病婿 | 2022-07-31 16:01:11 | 巴幣 4574 | 人氣 1691

前言
上篇講解基本水波反射、變形與使用固定環境貼圖,這回要講解動態環境貼圖以及比較非現實的Planar Reflection。
 
先上最近成果:

同樣有放在個人網站上:小寒舍(´▽`ʃ♡ƪ)


Real-time Cubemap

為了及時將畫面反射在水上,勢必要動態取得環境貼圖。Unity有個Cubemap類別,可使用如 Camera.RenderToCubemap 方法去產生貼圖(但不確定這麼做效能如何),或使用Reflection Probe,由Shader預先定義好的接口取用資料。

Reflection Probe

(Reflection Probe介面)

複習基本的反射原理:

有了世界反射方向向量後,即可對cubemap進行採樣。(Unity官方文件[1]的使用範例)
  • UNITY_SAMPLE_TEXCUBE:採樣cube貼圖,推薦服用文獻[2]。
  • HDR(High Dynamic Range)[3]:若在貼圖加入後綴_HDR,Unity會自動填入所需資料[4]。
  • 結果:
     
如參考文獻[2,5]所指,CubeMap採樣會以probe為起點,採樣到與反射方向水平方的像素,這在遠處看起來還好,但近處的反射就會很明顯的有偏差。為了修正需進行BoxProjection:



     
Planar Relfection
上文,我們透過unity_SpecCube0... 等關鍵字取得Reflection Probe提供的資料,但有個問題是環境cubemap的取樣是有一定弧度的(?),並不能精準的回饋出玩家畫面上的倒影。


如上圖看到玩家倒影有些走位、拉扯。
目標是做出如終結者利利這種鏡面反射,查了一下文章後又發現這種反射可稱為Planar Relfection。


建立鏡像相機
參考文獻[6],在每一幀計算一個與目標相機顛倒Y軸的投影矩陣:


    CalculateReflectionMatrix:輸入反射平面的法線與位置,進行反射之矩陣。

    來源[6]
GL.invertCulling:反射相機是鏡像的,需反轉culling順序。

Shader


*UNITY_PROJ_COORD 做跨平台處理,沒特殊情況的話,通常是返回輸入的值。
*tex2Dproj 相當於 Tex2D(uv.xy / uv.w)
(反射相機的結果)
 
結合上述的reflection probe與reflection camera的貼圖:

 
套用水波紋:
 


勉強維持住周更ㄌ
先醬子,晚上繼續搞場景(;´༎ຶД༎ຶ`)
送禮物贊助創作者 !
0
留言

創作回應

木白
也就是說會有另一個針對 Plane 的相機捕捉打到 Plane 以後延伸反射的畫面,然後像遮罩一樣切進 Plane 的畫面上嗎?
2022-07-31 16:33:22
%%鼠 拒收病婿
沒有針對哪個plane(這樣太多camera貼圖)或使用遮罩,而是將目前main camera的transform資訊翻轉,產生一個虛擬的鏡射相機投影矩陣,將渲染結果像貼uv的模式貼在平面上,缺點是plane的scale必須為1,不然會走樣。
2022-07-31 16:43:13
虛鹿
感覺Shader 超難的說
2022-07-31 17:09:44
%%鼠 拒收病婿
難在數學...QAQ
2022-07-31 18:29:59
木白
意思是每個要反射的 Plane 在即將被畫出來之前,會用同一個相機但從各自相對的反射位置捕捉到畫面,最後貼圖的時候沒有拍到物體的部分再跟原本的 Cubemap 結合?
2022-07-31 17:36:01
%%鼠 拒收病婿
拍謝,好像沒有寫清楚,簡單說是將水平面物件的frag位置拿去取鏡射影像的位置https://i.imgur.com/96HDY7k.png
2022-07-31 18:29:14
木白
想了一段時間才懂 QQ 感謝大佬解說
2022-07-31 18:43:20
追蹤 創作集

作者相關創作

更多創作