阿昌學(xué)習(xí)《RayTraing in one week》 (八)
第八章
上次加了漫反射材質(zhì),這次我們加入更多的材質(zhì)。
先搞一個材質(zhì)的抽象類,這里要注意兩點(diǎn):
會生成散射光線(或者說它吸收了散射的射線)
既然有散射,那么衰減率是多少
先聲明這個類:

材質(zhì)對于物體來說是必要有的一個屬性,整理一下hit_record結(jié)構(gòu)體:

修改好hit_record之后對應(yīng)的sphere中也要添加材質(zhì),也進(jìn)行一個簡單修改:

處理完hitable相關(guān)的之后,上一章中的漫反射材質(zhì)lambertian我們將他寫成一個類。
之前對于漫反射材質(zhì)來說,都有兩種情況,1是光線一直發(fā)生散射;2是光線每次都衰減 每次都被物體吸收1 - R的光線,這里也可以混合。那么我們lambertian類(上次在main中的隨機(jī)半球內(nèi)一點(diǎn)的方法也搬過來了):

然后要注意的是,我們也可以讓光根據(jù)一定的概率p發(fā)生散射,也可以按照光線的衰減率albedo/p來計(jì)算,作者覺得這個隨意。(這個albedo和代碼里的attenuation是一個意思)。
接下來寫一下金屬材質(zhì),對于金屬材質(zhì)而言,光線不會隨機(jī)散射出去。那么根據(jù)書里的圖就能簡單清晰的看到光線的實(shí)際路徑和其中的數(shù)學(xué)關(guān)系:

紅色的反射射線方向僅為(v+2b),這里n是知道的單位法向量,v是射光線但不一定是單位向量,b的長度是可求的 dot(v,n),因?yàn)橄蛄縱和b是方向相反的,那么帶入得到:
v + (- 2 dot(v,n) * n)。寫到代碼里:

反射公式也有了,那就可以寫一個金屬材質(zhì)類了:

現(xiàn)在我們寫好了材質(zhì)類以及新的金屬類,回到主函數(shù),將主函數(shù)和color方法都修改一下:

最后運(yùn)行的得到的圖就是這個了,沒得到就說明你寫錯啦。

反射的方向其實(shí)可以是隨機(jī)的

不過這樣的話就會發(fā)現(xiàn),球體越大,反射的效果就越是粗糙模糊。這就要引入一個參數(shù)fuzz來控制這個粗糙模糊的程度。如果fuzz=0那就說明沒有模糊現(xiàn)象,那么這樣的話隨機(jī)球的半徑變大, 光線就可能會散射到物體內(nèi)部。而fuzz的最大值,我們設(shè)置到1。寫到metal材質(zhì)中:

輸出三張不一樣數(shù)值的圖:



好了,本章節(jié)就結(jié)束了。書中有些部分確實(shí)給的不夠完整,我也會將我注意到的點(diǎn)給大家分享一下。下一篇中的內(nèi)容大家一定要仔細(xì)觀看,已得到最好結(jié)果。