詳細(xì)原文
警告! 實(shí)驗(yàn)性很高的文章, 如果你正在研讀或主修物理請(qǐng)別拿來當(dāng)研究的參考
這篇文章只是關(guān)於一個(gè)無知的人類企圖模仿上帝的傑作罷了, 靈感源自於家裡樓下前門:
一個(gè)平常不會(huì)去注意但出現(xiàn)時(shí)又會(huì)想看幾眼的效果 - Light Diffraction (
衍射)
一種光線穿越狹縫後產(chǎn)生偏移的現(xiàn)象, 若波長(zhǎng)對(duì)了就能看到對(duì)應(yīng)的彩色
這次的計(jì)算結(jié)果如下:
還沒完全理解造物主的意志, 公式上也還有一些寫死的地方, 所以結(jié)果跟現(xiàn)實(shí)世界還是有差, 但還是一次有趣的嘗試~和上次的
Hello Ray Tracing的不同處在於, 這次由於要在光追過程中取得材質(zhì)資料, 所以自製了
Hit Group Shader, 有了它我才能夠獲得材質(zhì)資料
其他的內(nèi)容還有, 加入了材質(zhì)usage flag, 所以我能決定擊中哪些物件要做衍射計(jì)算:
使用Temporal Sampling, 取樣前一張F(tuán)rame的結(jié)果來消除噪點(diǎn) (上為處理前下為處理後):
由於每個(gè)pixel產(chǎn)生了不只一條的射線, 降噪方法是必須的
整體效能約~0.8ms左右, 我的光追是跑在半解析度上的
看起來還行但還有很大的最佳化空間
剩下的細(xì)節(jié)就不在這邊贅述了
主要是在FRayTracingMeshProcessor::Process()裡指定了我自己的Hit Group Shader
這個(gè)函式是UE新增光追mesh command的地方
Future works不外乎, 用更好的方式與UE流程互動(dòng)、更好的公式運(yùn)用、效能最佳化、更好的結(jié)果輸出 (現(xiàn)在只是單純把顏色+到scene上)等等~
================================================================
加碼補(bǔ)充 - Ray Tracing vs Ray Marching
假設(shè)一條射線是A->B, 很多人誤以為光追是A走到B的過程, 這個(gè)其實(shí)叫做Ray Marching
Ray Marching在A往B的路徑上, 每一步前進(jìn)一個(gè)固定量, 一邊前進(jìn)一邊取樣, 最後輸出結(jié)果, RM廣泛的被應(yīng)用在很多算法上了, 像是SSR、God Ray、體積雲(yún)等等
而Ray Tracing注重的是"擊中物", 射線一開始早已經(jīng)決定好了起點(diǎn)與終點(diǎn)
RayCurrent = RayOrigin + T * RayDirection, T的範(fàn)圍是TMin~TMax
一般而言我們會(huì)設(shè)定一個(gè)足夠大的TMax, 當(dāng)光追流程擊中物件, 距離又小於這個(gè)TMax時(shí), 那系統(tǒng)就會(huì)刷新這個(gè)TMax, 讓它越來越小(越來越近). 最後得到的, 基本上是距離最近的物件, 除非過程中擊中了半透明物件並且中斷搜尋, 那又是另一個(gè)故事了..
TMin通常是0, 但起點(diǎn)我們通常會(huì)往Normal方向向外偏出一點(diǎn), 避免擊中自己
由遠(yuǎn)到近這個(gè)特色, 也算是"模擬"了光柵化裡的深度測(cè)試, 不是距離最近的結(jié)果我們就捨棄
對(duì)於半透明物件, 也是有辦法把遠(yuǎn)處的結(jié)果混色到較近的結(jié)果上
然後我們?cè)俑鶕?jù)系統(tǒng)回傳的重心座標(biāo), 來換算出擊中的網(wǎng)格UV、Normal、位置..等等
再根據(jù)這些資訊計(jì)算材質(zhì)以及效果
大概這樣~
英國(guó)女王喪禮多了一天國(guó)定假日, 在家閒閒沒事就寫了xd