創作內容

4 GP

Unity shader realtime reflection

作者:silo│2017-07-12 21:59:27│巴幣:8│人氣:1442
再來我們來考慮物體對環境的realtime reflection問題。

首先在PBS中,要實現realtime reflection 很簡單。
我們只要在物件中心點,放置一個reflection Probe。
並且將Metallic與Smoothness調成1,
如果需要即時反射,將type改成Realtime。




有關reflection Probe,我們可以看官網的資料(參考資料一)。
其中最主要的 :
reflection Probe會將自己範圍內所偵測到,
能夠被反射的物件,將它更新到場景的skybox中。




因此只要能取出skybox的資料,
就能完成realtime reflection的功能。

由於是要對場景中的skybox取樣:
half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.worldRefl);
half3 skyColor = DecodeHDR(skyData,unity_SpecCube0_HDR);

將skyColor輸出後,我們會發現。
雖然反射有了,但效果並不令人滿意 ,
背景部分非常的模糊…(最左邊的膠囊體)




那如果我們直接拿用來設定skybox的cubemap取樣。
結果會發現,雖然物體對背景的反射效果較好,
但反射探針並不會將資料更新到此cubemap中。
(最左邊的膠囊體)




因此我們需要對shader做一些處理。
想法很簡單,我們只需要:

1.物體對背景skybox的反射,我們使用到cubemap取樣。
2.而對周圍會變化的物件,我們取reflectionProbe的資料。
3.最後再將它們合併就好。

首先對cubemap取樣:
fixed3reflection = texCUBE(_Cubemap, worldRefl).rgb;

再來,由於是要對reflection Probe偵測到的反射物體取樣。
因此reflection Probe的資料更新,
不應該包含對周圍skybox的背景資料。

因此將reflection Probe的
ClearFlags改為SolidColor。
並將Background Color改為黑色(0,0,0)。




這樣,我們只要將reflection Probe中,
大餘0(非黑色)的部分取出及可。

再來是組合的部分。
要組合2張貼圖,我們利用一個choose參數。

float choose = step(_ReflectBlend, skyColor.x);

_ReflectBlend 用來控制取樣的範圍。
因為我們並不知道 ,背景與反射資料的色差該為多少,
才能完美將reflection Probe中,非Background的部分完全濾掉

最後結合2筆資料:

float3 finalcolor = lerp(skyData,reflection,1-choose);

choose參數 >0 取樣cubemap
choose參數 <0 取樣reflection Probe








參考資料
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3641725
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

4喜歡★kilufodo 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:Unity shader... 後一篇:Unity shader...

追蹤私訊切換新版閱覽

作品資料夾

likuyu00159京都櫻花滿開
2024日本賞櫻遊記好評連載中,歡迎來我的小屋觀看!看更多我要大聲說昨天23:12


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】