元旦快樂,送大家一條水晶龍

2021-09-08 22:53:05 字數 2923 閱讀 5304

首先,我仍然使用來自斯坦福的上鏡率超高的模型,這次是龍的模型。

將它匯入到unity的工程中。

同時,我們還需要乙個cubemap,用來提供環境資訊。可以看到,使用了模型匯入後unity的預設material的龍,在藍天白雲的映襯下… 就像一條石膏龍。

好了,基本準備工作已經完成了。那麼作為水晶龍打造計畫的第一步,我們首先來實現水晶龍對環境的反射,讓龍模型根據反射的結果去這個cubemap上取樣。

可能有些朋友會好奇,水晶龍的反射怎麼才能和cubemap建立起聯絡呢?其實很簡單,我畫一張示意圖各位就明白了。

其實這個過程很簡單,就是求的反射方向然後去cubemap上取樣作為水晶龍身上該點的顏色即可。

當然,由於折射和反射是乙個常用的需求,因此hlsl和glsl都有內建的a方法用來計算反射方向和折射方向。但是下文我還是會給出相關的推導過程。

接下來,我們需要實現對反射方向的計算。同樣,我也來畫一張示意圖來推導反射的過程,大家就應該能明白了。

其中向量i代表入射光線,從眼睛到物體表面。向量n代表表面法向量,向量r則代表反射光線。

通過上面的推導,我們就可以在shader內實現自己的反射函式了。

//

計算反射方向

float3 caculatereflectdir(float3 i, float3 n)

一旦獲取了反射方向之後,就可以在fragment shader內對cubemap取樣了。

fixed4 frag(v2f input) : sv_target

結果我們的龍就從石膏龍變成了能夠反射周圍環境顏色的龍了。

實現了反射的效果之後,我們還可以利用相似的思路來實現一些類似的效果,例如光的折射效果。

所謂的光的折射指的是當光通過不同密度的兩種材質之間的介面時——比如空氣和水——光的方向會發生改變。

當光波從一種介質傳播到另一種具有不同折射率的介質時,會發生折射現象,其入射角與折射角之間的關係,可以用斯涅爾定律(snell』s law)來描述。

下面我就利用斯涅爾定律來計算折射方向,進而正確的在cubemap上為龍的折射效果進行取樣。同樣,我也會畫一張示意圖,並將推導過程寫在上面。

按照上文的公式推導,我們可以很簡單的翻譯成對應的shader方法。

//

計算折射方向

float3 caculaterefractdir(float3 i, float3 n, float

ratio)

設n1/n2的值為0.9,對龍進行一次折射(因為光從空氣進入模型會發生一次折射,從模型進入空氣仍然會有一次折射,為了簡單我們只考慮一次折射的情況)的結果如下圖:

ok,在上文中我們分別討論了如何在shader內實現反射和折射效果。但是在現實生活中,反射和折射可能是同時發生的。

乙個生活中簡單的小例子就是我們只有在幾乎垂直向下看的時候,才能看到池塘內水下的情況。而在乙個較小的角度觀察池塘時,又會因為大部分會被反射而幾乎沒有什麼折射,因而很難透過水的表面看到池塘內的情況。

這就是因為當光從一種具有折射率為n1的介質向另一種具有折射率為n2的介質傳播時,在兩者的交界處(通常稱作介面)可能會同時發生光的反射和折射——這便是菲涅耳效果。

而菲涅爾方程則描述了不同光波分量被折射和反射的情況。也描述了波反射時的相變。但是,精確描述底層物理現象的菲涅耳公式是非常複雜的,因此在圖形學中往往會採用菲涅耳公式的近似,而非菲涅耳公式本身。

r(θ) = r0 + (1 - r0)(1 - cosθ)5

還有乙個近似則是我們要使用的經驗近似,相對來說經驗近似的效果更可控。

r = max(0, min(1, bias + scale * (1.0 + i • n)power))

其中r代表了反射係數。向量i從眼睛指向物體表面,向量n是該點的法線,bias、scale、power則是用來調整菲涅耳效果表現的經驗引數。

而這個近似公式的基本概念就是當i和n幾乎重合的時候,反射係數應該接近0,大部分的光會被折射。當i和n分開的時候,反射係數逐漸增大,被反射的光變多。而這個係數也應該保持在0~1之間。因此,在shader中可以像下面這樣來實現:

//

菲涅耳效果

float

最終,在fragment shader內利用菲涅耳近似公式將反射效果和折射效果結合在一起,就能夠實現乙個更加真實的水晶龍效果了。

最後打個廣告,歡迎支援我的書《unity 3d指令碼程式設計》

ubuntu裝機一條龍

ubuntu 20.04 安裝 安裝windows虛擬機器 中文輸入法 軟體安裝 sudo apt get install fcitx googlepinyin 谷歌拼音輸入法 sudo apt get install git git sudo apt get install stacer 系統管理...

nvm安裝 node nrm gulp一條龍

windows下安裝及使用nvm nvm安裝前需要解除安裝原來的node.js 更改nvm資料夾內settings.txt 根據自己電腦查詢users是自己的電腦使用者名稱 在你安裝的目錄下找到settings.txt檔案,開啟後加上 node mirror npm mirror nvm versi...

Typora iPic Mac 輸出文章一條龍

typora是一款 所見即所得 的markdown編輯工具 ipic mac專享 是一款圖床神器,不論螢幕截圖 還是複製,都可以自動上傳 儲存 markdown 格式的鏈結,直接貼上插入。自帶微博圖床,一年衝50 後可以拓展其他圖床。這樣的話在往typora文件中插入本地或者網路時就會自動上傳到圖床...