《一周學完光線追蹤》學習 十一 離焦模糊

2021-10-06 17:39:03 字數 2179 閱讀 6437

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術

現在我們的最後乙個特點:離焦模糊。注意,所有的攝影師都會稱之為「景深」,所以請注意,只有在朋友之間使用「離焦模糊」。

在真正的相機中,我們使焦距模糊的原因是因為它們需要乙個大洞(而不僅僅是乙個針孔)來收集光線。這會使所有的東西都散焦,但是如果我們把乙個鏡頭插進洞裡,就會有一定的距離,所有的東西都會聚焦。到物體聚焦平面的距離由透鏡和膠片/感測器之間的距離控制。這就是為什麼當你改變焦點時,鏡頭會相對相機移動(這也可能發生在你的手機攝像頭中,但感測器會移動)。「光圈」是乙個控制鏡頭有效大小的孔。對於乙個真正的相機,如果你需要更多的光線,你會使光圈更大,會得到更多的離焦模糊。對於我們的虛擬相機,我們可以有乙個完美的感測器並不需要更多的光線,所以當我們想要離焦模糊時我們只有乙個光圈。

真正的相機有乙個複雜的復合鏡頭。對於我們的**,我們可以模擬順序:感測器,然後是鏡頭,然後是光圈,計算出光線的傳送位置,並在計算後翻轉影象(影象被倒投影到膠片上)。圖形學使用者通常使用薄透鏡近似。

我們也不需要模擬相機的任何內部。為了在攝像機外渲染影象,這將是不必要的複雜性。取而代之的是,我通常從透鏡的表面開始發出光線,然後通過找到膠片在聚焦平面上的投影(在距離焦距處)將它們傳送到虛擬膠片平面。

為此,我們只需要讓光線的原點在乙個磁碟上,而不是從乙個點看:

#ifndef __camera_h__

#define __camera_h__

#include "ray.h"

#define m_pi 3.14159265

vec3 random_in_unit_disk() while (dot(p, p) >= 1.0);

return p;

}class camera

ray get_ray(float s, float t)

vec3 origin;

vec3 lower_left_corner;

vec3 horizontal;

vec3 vertical;

vec3 u, v, w;

float lens_radius;

};#endif

使用大光圈:

list[0] = new sphere(vec3(0, 0, -1.0), 0.5, new lambertian(vec3(0.8,0.3,0.3)));

list[1] = new sphere(vec3(0.0, -100.5, -1.0), 100, new metal(vec3(0.8, 0.8, 0.4),0.4));

list[2] = new sphere(vec3(1.0, 0.0, -1.0), 0.5, new metal(vec3(0.8, 0.6, 0.2),0.1));

list[3] = new sphere(vec3(-1.0, 0.0, -1.0), 0.5, new dielectric(1.5));

list[4] = new sphere(vec3(-1.0, 0.0, -1.0), -0.45, new dielectric(1.5));

list[5] = new sphere(vec3(-2.0, 0.0, -1.5), 0.5, new metal(vec3(0.8, 0.6, 0.2), 0.1));

hitable *world = new hitable_list(list, 6);

vec3 lookfrom(3, 3, 2);

vec3 lookat(0, 0, -1);

float disk_to_focus = (lookfrom - lookat).length();

float aperture = 2.0;

camera cam(lookfrom,lookat,vec3(0,1,0),20,float(200)/float(100),aperture,disk_to_focus);

得到效果:

《一周學完光線追蹤》學習 六 抗鋸齒

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 當乙個真正的相機拍攝一張 通常沒有沿邊緣的鋸齒,因為邊緣畫素是一些前景和一些背景的混合。我們可以通過平均每個畫素內的一組樣本來獲得相同的效果。我們不必為分層而煩惱,這是有爭議的,但對我的節目來說卻是司空見慣的。對於某些光線 來說,這是非常關鍵的,但...

《一周學完光線追蹤》學習 三 光線相機和背景

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 所有光線 都有乙個光線類,以及計算沿光線看到的顏色。讓我們把射線看作乙個函式,p t a t b,這裡p是3d中沿直線的3d位置,a是射線的原點,b是射線的方向。射線引數t是實數 中的浮點數 插入不同的t和p t 沿射線移動點。加上負t,你就可以得...

《一周學完光線追蹤》學習 九 電介質材料

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 透明材料如水 玻璃和鑽石都是電介質。當光線擊中它們時,它 成反射光線和折射 透射 光線。我們將通過在反射或折射之間隨機選擇並在每次互動中僅生成乙個散射光線來處理該問題。最難除錯的部分是折射光線。如果有折射光線的話,我通常先讓所有的光線折射。為了這個...