創作內容

2 GP

Unity shader Cubemap 環境映射

作者:silo│2017-07-12 07:11:42│巴幣:1,002│人氣:1855
一般在表現金屬材質時,除了表面的高光反射外,
我們還會希望金屬表面能反射周圍的環境。
這時就要使用到CubeMap(立方體紋理)。

CubeMap是一個具有6個面的立方體,
每個面上都有貼圖。

當物體在此立方體中,
往前後左右上下看,
就會看到此立方體上6個面的貼圖。
(skybox就是運用這種特性)

為了表現金屬的反射特性,
必須將周圍環境當成貼圖,
貼在物體上。




如圖
橘色:CubeMap
紅色 入射向量
藍色:頂點法向量
綠色:反射向量

今天我們觀察物體上某一點時,
物體如要將周圍環境傳到我們眼中。

需要經過反射後,將對映到的立方體紋理,貼在自己身上。
這樣觀察的人,就可以看到物體反射周圍環境。

首先反射的方向,可由下式求得:

o.worldRefl =reflect(-o.worldViewDir, o.worldNormal);

reflect函數,可以讓我們將
頂點指向觀察點的反方向為入射角,
並以頂點在世界座標為基準,
來求出反射方向。

當有反射方向後,代入:

fixed3reflection = texCUBE(_Cubemap, i.worldRefl).rgb;
即可找出此worldRefl指向的CubeMap的取樣值。



我們可以自己做一個立方體紋理,
交給此物體來對映自己周圍的環境。

Create --> Legacy --> Cubemap
先創造一個新的Cubemap。



我們可以自己給它6個面上的貼圖,或是點擊視窗:

GameObject --> Render into Cubemap



然後將物件的位置與我們的cubemap給它,
(注意此時的cubemap的Readable須打勾)
再按下 "Render!"。

這樣就可以得到在某個特定的點上,
所看到的Cubemap。

以上是使用我們指定的Cubemap來取樣,
另外我們也可以對場景中的skybox直接取樣。

在官網的範例中(參考資料),
要對skybox取樣,只需利用:

half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0,i. worldRefl);
half3 skyColor = DecodeHDR(skyData, unity_SpecCube0_HDR);
這skyColor就是取樣值。

不過由下兩張圖來看,
即使skybox換成與Cubemap一樣,
這兩種取樣方式出來的結果,還是不同。

為了看的明顯一點,
2個膠囊體的ambient(環境光)暫不考慮。
由skybox取樣的結果(右邊膠囊體),表面比較模糊。




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

相關創作

留言共 0 篇留言

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

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

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

追蹤私訊切換新版閱覽

作品資料夾

zzz54872qw想要重來的你
【敬啟:無法重來的你。】第四章-第六節-被捕獲的影子。即將步入結局!歡迎來我的小說看看喔!看更多我要大聲說19小時前


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

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