《再學一周光線追蹤》 學習 二點五 程式測試

2021-10-06 21:56:13 字數 2034 閱讀 6142

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

上節寫的程式太多,這一節我們測試一下。

首先我們要把 hitable_list裡面繼承的類實現一下,裡面的內容可以是空的,否則抽象類不能初始化。(當然這段程式裡我們也不需要初始化抽象類)

bool hitable_list::bounding_box(float t0, float t1, aabb&box)const
然後在生成隨機球的函式中我們為了快速檢測先遮蔽掉一些小球:

hitable *random_scene() 

else if (choose_mat < 0.95)

else

}} }*/

list[i++] = new sphere(vec3(4, 1, 0), 1.0, new metal(vec3(0.7,0.6,0.5),0.0));

list[i++] = new sphere(vec3(0, 1, 0), 1.0, new dielectric(1.5));

list[i++] = new sphere(vec3(-4, 1, 0), 1.0, new lambertian(vec3(0.4,0.2,0.1)));

//return new hitable_list(list, i);

return new bvh_node(list,i,0.0,1.0);

}

注意最後返回的是 bvh_node物件。執行得到結果:

很遺憾我們得到的是背景色,也就是說,bvh類沒有碰撞到物體:我們修改一下color類:

vec3 color(const ray&r,hitable *world,int depth) 

else

} else

}

如果碰撞到了檢測點,就列印輸出 hit somthing。結果果然什麼都沒列印。

除錯了一段時間,發現必須加上這句話:

if (!left->bounding_box(time0, time1, box_left) || !right->bounding_box(time0, time1, box_right));
以前我覺得這句話可能是多餘(原文中判斷錯誤會輸出錯誤資訊然後終止程式),所以就遮蔽掉了,沒想到這句話還進行了一些有保留的修改。

然後測試結果如下:

}生成這幅影象只用了20秒!

然後我們還是使用以前的hitable_list類計算,生成該圖花費1分13秒,顯然慢了很多倍。

《再學一周光線追蹤》 學習 七 實物(二)旋轉

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 旋轉不是很容易理解或生成公式。一種常見的圖形策略是應用圍繞x y和z軸的所有旋轉。這些旋轉在某種意義上是軸對齊的。首先,讓我們繞z軸旋轉 這只會改變x和y,而不依賴於z。這涉及到一些基本的三角學,使用的公式,我將不在這裡介紹。這給你乙個正確的印象,...

《再學一周光線追蹤》 學習 七 實物(一)

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 康奈爾盒子裡通常有兩個街區。它們相對於牆旋轉。首先,讓我們製作乙個軸對齊的塊原語,它包含6個矩形 class box public hitable box const vec3 p0,const vec3 p1,material ptr virtu...

再學一周光線追蹤 bvh樹流程

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 這次詳細分析一下 再學一周光線追蹤 裡面bvh樹和包圍盒繫結的流程,為了加入三角麵片來進行優化。在hitable類的派生類sphere中只有乙個返回項bounding box,返回sphere的包圍盒。但是sphere和這個返回的包圍盒並沒有直接聯...