蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術
上節寫的程式太多,這一節我們測試一下。
首先我們要把 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和這個返回的包圍盒並沒有直接聯...