Raytrace學習的階段性總結

2022-03-13 19:51:04 字數 2029 閱讀 9702

最近乙個月一直在學習raytrace,從理論到**實現,之前最近才終於有了乙個比較完整的版本,遂打算把之前的一些學習經歷寫出來。

raytrace又稱光線跟蹤,業界公認此演算法為turner whitted在2023年提出,而它本身又是由原來的光線投射演算法(ray casting)演變而來的,ray casting本身是用來消除場景中隱藏面的一種演算法,whitted將其擴充套件為遞迴演算法後則成為了傳統的raytrace演算法。標準的raytrace一般採用逆向跟蹤技術來完成整個繪製,即從視點出發計算螢幕上每乙個畫素點的顏色值。其大部分過程是於物體求交,若該光線擊中物體,那麼要先判斷物體的材質,若為理想漫發射表面,則利用區域性光照模型(因為可以方便地對頂點法向量進行插值,所以可以方便地使用phong著色模型)求出乙個顏色值,若為鏡面反射值或透射值,則產生一道反射(透射)光線,遞迴地計算,這也就是說假如當前場景所有物體都是理想漫反射材質的話,raytrace演算法也就退化成了raycasting。當然實際實現的時候肯定沒有上面說的這麼簡單,由於有太多細節要考慮,就簡單說說實現的歷程和效果吧。

1階段.只有primary ray(raycasting)

對每個畫素點進行投射求交,然後利用區域性光照模型(phong)計算顏色值,並有陰影點判斷(陰影點判斷本身也是乙個raycasting,即從該點到光源作一次光線投射,檢測其中有沒有障礙物)。

(圖1)

2階段.加入了reflection ray,這樣就可以處理鏡面,可以這樣理解這個問題,當人的視線擊中乙個鏡面的時候,那他還可以看見視線(可以想象為一條射線)由鏡面發射之後擊中的物體表面,這其中就多了乙個求反射向量,和顏色疊加的過程。

(圖2)

3階段.加入了refraction ray,這樣可以處理透明物體,當然光的折射滿足折射定律,並且需要處理全反射和透射衰減的情況,並且一般的透明材質的內外表面都還有反射(這個地方感覺自己一直都處理得不好),具體的細節以後有時間的話再給出吧。

(圖3)

4階段.加入了簡單的紋理對映,只針對球面和平面(因為目前這個階段也只做了球,軸對齊矩形和軸平面這幾個物體,還沒有加入三角形)。而球面對映,我採用的也是最簡單的經緯座標對映。這個部分同時需要載入影象檔案,由於時間有限,我自己只寫了乙個24位bitmap的載入以及直接抄襲了jacco bikker的一段tga載入的**(實際上我從頭到尾都參考了他的**)。

(圖4)

5階段.加入了三角形的處理,載入obj檔案模組,使用kd-tree對場景進行優化,以及各種其他優化,不過效率仍然很低,特別是開啟全屏抗鋸齒以後。(還是感覺效果不是很好啊!)

(圖5)

關於優化的一些心得:

1.stl在debug版本和release版本下的實現貌似不同,在debug版本下hash_map的find操作非常耗時,但是到了release版本竟然快如閃電,還有vector的一些操作也是這樣,讓我白白花費了好多時間來嘗試對其進行優化。

2.對於檔案的讀入,特別是一些大的模型.obj檔案或texture通常都是幾兆甚至數十兆,應該盡量一次性全部讀入記憶體(最多分幾次讀入)然後再進行分析,載入模型這乙個函式就夠你受的。

3.在關鍵**處最好不要用運算子過載。運算子過載雖然可以使**的可讀性大幅提高,但是在執行頻率很高的**段還是別用的比較好,記得有一次就是只改了乙個求交函式中的運算子過載**,結果計算時間直接從8s減至7s。

不過即使這樣效率仍然較低,沒有用sse優化,kd-tree裡的sah劃分子空間標準也沒有完全實現,勉強能應付三角形面在10w以下的場景。

階段性學習總結

我記得剛開學第一節課的時候,婁老師曾說過學期末會給排名靠前的同學發放小黃衫,沒想到這個獎勵來得這麼突然 手動開心 能夠成為第一批獲得小黃衫的人是對我這一學期以來的努力的肯定,但同時也讓我感到了幾分壓力,使我不太敢懈怠,而這種壓力也將支援我繼續前行。在這裡,我得先感謝一下進入大學以來第乙個讓我感到耳目...

階段性學習心得

本文是在2016年c 程式設計學習結束之後所作。首先,在這裡我衷心的感謝賀利堅老師,他真的特別特別用心的為我們這群it菜鳥鋪平起飛的跑道。但是也要說一聲對不起,因為這個學期我辜負了老師,也對不起自己。因為在大學之前一直是一種被動型學習,沒有養成主動學習的好習慣,所以賀老師的這種翻轉課堂讓我感到挺不適...

階段性總結

今天聽學長交流了一些人生的經驗,便有了一些感觸,加上對自己最近的學習狀態的總結,就寫一篇部落格給自己一點指示。最近渾渾噩噩的,有幾次考試也沒考好,考後也沒總結。晚自習本想刷一些題,複習一下,或是學習一點技術。看見其他同學在打擺,便動搖了。最後心中也只是徒留深深的罪惡感。所以我也是時候對自己的未來進行...