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

2021-10-06 14:12:31 字數 1664 閱讀 7519

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

所有光線***都有乙個光線類,以及計算沿光線看到的顏色。讓我們把射線看作乙個函式,p(t)=a+t*b,這裡p是3d中沿直線的3d位置,a是射線的原點,b是射線的方向。射線引數t是實數(**中的浮點數)。插入不同的t和p(t)沿射線移動點。

加上負t,你就可以得到3d線上的任何地方。對於正t,你只得到a前面的部分,這就是通常所說的半線或射線。示例c=p(2)如下所示:

現在我們準備好轉彎,做乙個光線***。光線***的核心是通過畫素傳送光線,並計算在光線方向上看到的顏色。它的形式是計算從眼睛到畫素的光線,計算光線與畫素相交的部分,並計算該相交點的顏色。在第一次開發光線***時,我總是用乙個簡單的相機來啟動和執行**。我還做了乙個簡單的顏色(光線)函式,返回背景的顏色(乙個簡單的漸變)。

我經常在使用正方形影象進行除錯時遇到麻煩,因為我經常轉換x和y,所以我將堅持使用200x100影象(這裡我還是用的512*512的影象)。我將把「眼睛」(或者相機中心,如果你想到相機的話)設為(0,0,0)。我讓y軸向上,x軸向右。為了尊重右手座標系的對流,進入螢幕的是負z軸。我將從左下角遍歷螢幕,並使用沿螢幕邊的兩個偏移向量來移動螢幕上的光線端點。請注意,我沒有將光線方向設定為單位長度向量,因為我認為不這樣做會使**更簡單、速度略快。

在下面的**中,光線r接近畫素中心(我現在不擔心精確性,因為我們稍後將新增抗鋸齒):

#ifndef ray_h

#define ray_h

#include "vector3.h"

class ray

ray(const vector3& a, const vector3& b)

ray(const ray& r)

vector3 origin() const

vector3 direction() const

vector3 invdirection() const

void setorigin(const vector3& v)

void setdirection(const vector3& v)

vector3 pointatparameter(float t) const

vector3 data[3];

int posneg[6];

};#endif

寫個程式測試一下:

vector3 lower_left_corner(-2.0, -1.0, -1.0);

vector3 horizontal(4.0,0.0,0.0);

vector3 vertical(0.0,2.0,0.0);

vector3 origin(0.0, 0.0, 0.0);

for (int j = height-1;j >= 0;j--)

}

得到效果如圖:

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

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

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

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

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

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 現在我們的最後乙個特點 離焦模糊。注意,所有的攝影師都會稱之為 景深 所以請注意,只有在朋友之間使用 離焦模糊 在真正的相機中,我們使焦距模糊的原因是因為它們需要乙個大洞 而不僅僅是乙個針孔 來收集光線。這會使所有的東西都散焦,但是如果我們把乙個鏡...