《用兩天學習光線追蹤》6 漫反射材質

2021-10-03 10:26:35 字數 2731 閱讀 4076

目錄:

《用兩天學習光線追蹤》1.專案介紹和ppm輸出

《用兩天學習光線追蹤》2.射線、簡單相機和背景輸出

《用兩天學習光線追蹤》3.球體和表面法向量

《用兩天學習光線追蹤》4.封裝成類

《用兩天學習光線追蹤》5.抗鋸齒

《用兩天學習光線追蹤》6.漫反射材質

《用兩天學習光線追蹤》7.反射向量和金屬材質

《用兩天學習光線追蹤》8.折射向量和電介質

《用兩天學習光線追蹤》9.可放置相機

《用兩天學習光線追蹤》10.散焦模糊

《用一周學習光線追蹤》1.動態模糊

《用一周學習光線追蹤》2.bvh樹、aabb相交檢測

《用一周學習光線追蹤》3.純色紋理和棋盤紋理

《用一周學習光線追蹤》4.柏林雜訊

《用一周學習光線追蹤》5.球面紋理貼圖

《用一周學習光線追蹤》6.光照和軸對齊矩形

《用一周學習光線追蹤》7.長方體和平移旋轉

之前鋪墊了那麼久,現在終於開始進入正題了。本節將會是乙個重大的轉折點,我們將會看到光線在漫反射材質表面反射的效果。

本節**:main6.cpp

如果光線射向漫反射材質物體(表面不規則),則反射光線具有隨機的方向。以剛剛的場景為例,乙個大球上面有個小球,材質均為漫反射材質。下面的三條射線,具有不同的隨機反射行為:

隨機反射行為

假設某條射線(即下圖中綠色的射線)命中了我們場景中的球,命中點為p,則我們可以人為地定義乙個跟p點相切的單位球,在球體內部隨機找乙個點s,則p指向s的向量就是我們想要的反射向量。其中,n為p點上的單位法向量,可得單位球球心的座標為p+n

第一步:在乙個x,y,z的範圍為-1到1的單位立方體裡面,隨機取乙個點

第二步:判斷該點到立方體中心的距離是否<1,若是,則該點在單位球體內,演算法結束。否則,重複第一步和第二步。

**如下:

vec3 random_in_unit_sphere()

while

(p.squared_length()

>=

1.0)

;return p;

}

此時我們可以通過random_in_unit_sphere()得到單位球區域性座標內的乙個隨機點s了。

但我們還需要將s轉換到場景所在的世界座標,只需加上該單位球的球心座標p+n

p+np+

n即可,寫成**就是:

vec3 s_world = p + normal +

random_in_unit_sphere()

;

接下來開始用遞迴實現反射射線的取樣。漫反射材質本身不發光,我們發射的射線取樣到其表面的顏色,本質上,就是射線命中其表面後,反射射線取樣到的顏色,而反射射線可能會進一步命中其他物體,繼續反射下去。

我們繼續用兩個漫反射材質的球體為例:

上圖的藍色射線,到達a點後開始反射,反射後到達b點繼續反射,最後沒有命中其他物體了,才會取樣到遠處某點的顏色,例如我們定義的天空的藍色。

可以用遞迴來實現這種行為,假設每次反射會被吸收一半的光線能量,則每次的反射取樣的返回值要減半,只需增加兩行**:

//發射一條射線,並取樣該射線最終輸出到螢幕的顏色值值

vec3 color

(const ray &r, hittable *world)

else

}

如果光線一直反射,則上述遞迴會一直進行下去,直到射線沒有命中物體,則取樣天空的顏色並返回。

效果如下:

由於我們沒有定義材質本身的顏色,也沒有實現顏色的混合,所以目前看到的兩個球體都呈現出暗藍色,也就是射線在球體表面反射後,取樣到的天空淡藍色衰減後的顏色。

目前影象的顏色非常地暗,因為沒有進行伽馬校正,現在簡單粗暴地對顏色值開方,實現類似伽馬校正的效果。只需在入口函式中新增一行**:

void

raytracing()

col /

=float

(ns)

; col =

vec3

(sqrt

(col[0]

),sqrt

(col[1]

),sqrt

(col[2]

));//new}}

}

伽馬校正後效果如下:

參考資料:《ray tracing in one weekend》

《用兩天學習光線追蹤》10 散焦模糊

目錄 用兩天學習光線追蹤 1.專案介紹和ppm輸出 用兩天學習光線追蹤 2.射線 簡單相機和背景輸出 用兩天學習光線追蹤 3.球體和表面法向量 用兩天學習光線追蹤 4.封裝成類 用兩天學習光線追蹤 5.抗鋸齒 用兩天學習光線追蹤 6.漫反射材質 用兩天學習光線追蹤 7.反射向量和金屬材質 用兩天學習...

《用兩天學習光線追蹤》5 混合密度函式取樣

目錄 用兩天學習光線追蹤 1.專案介紹和ppm輸出 用兩天學習光線追蹤 2.射線 簡單相機和背景輸出 用兩天學習光線追蹤 3.球體和表面法向量 用兩天學習光線追蹤 4.封裝成類 用兩天學習光線追蹤 5.抗鋸齒 用兩天學習光線追蹤 6.漫反射材質 用兩天學習光線追蹤 7.反射向量和金屬材質 用兩天學習...

這兩天的學習

系統學習了控制系統計算機輔助設計 matlab語言與應用,包括無約束 有約束最優化問題的求解,曲線擬合的最小二乘求解函式,高階微分方程或微分方程組轉化為一階微分方程組的一般方法,不同系統數學模型之間的相互轉換,s變換 z變換,連續轉離散,離散轉連續,模型降階演算法,各種基於狀態空間的模型降階方法,多...