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

2021-10-03 10:26:36 字數 2848 閱讀 2630

目錄:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.新增相機的引數,實現乙個帶光圈可散焦模糊的相機。

2.場景中隨機生成更多的不同材質球體。

本節**:main10.cpp、main11.cpp

我們之前定義的相機,本質上是乙個針孔相機。如下圖所示,真正的針孔相機成像是倒立的,但根據三角形相似,在**中可以將螢幕挪到相機的位置的前方,從而避免倒立的情況,並更直觀地去定義射線的起點和方向,回憶上一節camera類的**:camear類裡面有乙個origin,表示相機的位置(對應下圖「我們相機的位置」),然後從相機的位置出發,對著螢幕(對應下圖「我們的螢幕」)上的每乙個畫素發射射線進行取樣。

針孔相機中(假設孔徑足夠小),則從樹的頂點p到螢幕,只能通過一束光來成像這個點。帶鏡頭的相機中,光線不是透過乙個點(或者說「孔」)傳入到成像螢幕的,而是透過具有一定半徑的透鏡傳入的,半徑的長度對應光圈的大小。這就導致成像的光線不僅只有一束,而是多束。

下圖中,相機位置依然跟上圖一樣。紅色光線反映了針孔相機中,將樹的頂點p和最低點q,傳入相機螢幕的情況。藍色光線就是鏡頭相機的成像情況,對於頂點p,其傳入到成像螢幕的範圍,從之前的一條光線,擴大到l1到l2兩條光線之間的部分,儘管取樣的光線變多了,但並不影響這一棵樹的清晰成像,因為目前這棵樹到相機的距離,剛好是新的螢幕到相機的距離,即焦距。

1.將這顆樹往相機的方向移動,原本能取樣到樹頂的畫素顏色,變成了多條光線取樣值的混合色,也即是樹頂部下面一片區域的顏色,從而導致這個畫素變模糊,越往前移動,越模糊,因為l1和l2的區間會擴大更多。

2.將這棵樹高度稍微拉高一點,並將其往後面移動,延長光線l1和l2至樹的縱切平面,則會取樣天空和樹頭頂的顏色的混合色,同樣實現模糊。越往後,l1和l2的區間將會擴大,從而越模糊。

生成單位圓內的點的函式:

inline vec3 random_in_unit_disk()

while

(dot

(p,p)

>=

1.0)

;return p;

}

更新相機類:

class

camera

ray get_ray

(float s,

float t)

};

下面是光圈從0.0遞增到3.0的效果:

增加隨機場景函式,並修改相機引數:

vec3 lookfrom(13

,2,3

);vec3 lookat(0

,0,0

);float dist_to_focus =

10.0

;float aperture =

0.1;

hittable *

random_scene()

else

if(choose_mat <

0.95

)else}}

} list[i++]=

newsphere

(vec3(0

,1,0

),1.0,

newdielectric

(1.5))

; list[i++]=

newsphere

(vec3(-

4,1,

0),1.0

,new

lambertian

(vec3

(0.4

,0.2

,0.1))

);list[i++]=

newsphere

(vec3(4

,1,0

),1.0,

newmetal

(vec3

(0.7

,0.6

,0.5),

0.0));

return

newhittable_list

(list,i)

;}

效果如下:

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

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

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

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

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

這兩天的學習

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