出於3D計算機圖形學和圖形渲染方面的個人興趣,腦子里便萌生出了自己實現一個渲染器的想法,主要是借助pathtracing這種簡單的算法,外加GPU加速來實現,同時也希望感興趣的朋友們能夠喜歡,也歡迎提出一些更好的看法~~。
(本人水平有限,若有錯誤也請指正~)
首先列個提綱......:
1)局部光照與全局光照簡介
2)GPU並行運算在圖形渲染的應用
—————————————————————————————————————————————————
1)pathtracing算法簡介:
在利用計算機表達現實生活景物的思想逐漸成型時,人們最初是利用所謂的局部光照模型來進行物體表面着色的,這種光照模型只能算得上是預覽品質,在當時計算能力不高的硬件水平上已經能夠達到一個比較滿意的效果,這里我們要記住兩個人,一個是Phong,一個是Lambert,前者推導出了理想漫反射表面對入射光所遵從的物理模型,后者提出了一個渲染物體表面高光質感的視覺近似模型。這里我們要提前做一些符號約定:規定所有的單位向量均由物體表面內部指向外部,由光線擊中處O向光源引出的單位向量記為L,O向視線引出的單位向量為E,O向鏡面反射方向的方向引出單位向量,記為R,由O出發指向外側垂直於O所在表面的單位向量為N,即法線。

Lambert的模型:Lambert給出了漫反射表面遵從的物理模型公式,即設漫反射光線強度為I(介於0與1之間),則I正比於E與L之間所成角的余弦值,由於均為單位向量,則

實際中對比例系數再次進行定義以便更好描述物體表面屬性,增加Kd與Id,這里的d為diffuse的縮寫,Kd即為漫反射表面自身對光線的反射程度,1表示所有的光不吸收,全部進行漫反射,0則吸收所有入射光,對外呈現純黑色,Id則為入射光強度,也是介於0~1之間,則

Phong模型:Phong解決了物體表面的高光反射的問題,給出了視覺近似公式,隨物體表面粗糙程度的不同,入射光線的所有可能的出射方向由理想鏡面反射方向到理想漫反射方向之間過渡,Lambert近似給出在過渡過程中的視覺變化,其公式為

位於指數次冪的n代表了物體的光滑程度,n越大,則物體表面越光滑,相當於視向量E對於鏡面反射向量R越敏感。
為了更好的描述物體表面,將這兩項相加即可,I=Id+Is,所表現的物體表面既有高光反射質感,不進行高光反射的地方可以利用漫反射公式對其進行着色。
以上所述的兩種着色方式是局部光照模型的典型代表,這里的“局部”含義即為:物體表面的亮與暗僅與着色處的一些參量有關,而與場景中其它物體的反射,遮擋等等其它因素均無關,當對下圖所示情況進行着色時,局部光照模型無法給出圖示處的陰影現象。

光在場景中的傳輸過程的本質是很簡單的,折射(透射),反射,吸收。其中的反射又可分為漫反射,高光反射與鏡面反射,這三種反射是由於物體表面光滑程度的不同而來的。但是,由於現實生活中場景的復雜程度變化多樣,這就造成了一些常見的現象:溢色與焦散現象,溢色即如下左圖所示(圖片來源於網絡):紅色的物體反射的光線射向牆面使得白色的牆面染上了紅色,如同顏色“溢出”到其它物體一樣。焦散現象如下右圖(圖片來源於網絡),本質是透射物體對光線的匯聚與分散作用。


而上述現象對於傳統的局部光照模型來講是無法實現的,全局光照模型則是為了解決上述問題和出於真實感渲染的目的應運而生的,全局光照模型考慮的是光線在場景中如何傳輸並與場景中的物體進行物理擬真交互的問題,從而得到一張真實度很高的渲染成品,常見的一些全局光照的手段有:基於光子貼圖(Photon Mapping)的方法,基於路徑跟蹤(Path Tracing)的方法,這兩種方法,前者從光源處發射光子,並記錄光子在場景中傳輸所產生的記錄,后者則是從視線出發對場景進行采樣,可以說這兩種方法的思路是相反的,但對於表現真實感的場景,都是很好的算法,而且已經應用了很長時間。
2)GPU並行運算在圖形渲染的應用:
GPU的概念最初是由NVIDIA提出的,也就是我們所說的“顯卡”,現在的顯卡已經由一個傳統的游戲設備,逐漸往通用計算領域發展。對於傳統游戲設備,現代的GPU能夠通過像OpenGL和Direct3D這種即時圖形API在屏幕上呈現出即時影像,CPU通過這些API,經由底層驅動給GPU發送繪圖數據和繪圖指令等等。而對於通用計算領域,CPU則可以通過像CUDA,OpenCL這類API給GPU發送計算指令,計算得到的數據傳回CPU進行后續處理。CUDA是NV的,而OpenCL則是一個開放的標准,AMD,Intel,Apple都支持這個標准,目的是利用上任何一個能夠參與計算的設備,通用性比CUDA強,但是其效率沒有CUDA高。上述的兩種全局光照算法均可以在GPU上得以實現,且實現的效率能夠超過GPU約兩個數量級,這歸功於GPU的並行設計理念。而且隨着GPU硬件的不斷發展,GPU的一些硬件優勢也得以體現,如今的GPU的雙精度浮點運算能力都要比CPU快很多倍,單精度則更快,同時GPU的顯存是沒有分頁機制的,內部帶寬也很高,因此訪存延遲要比CPU少很多。這就是在某些場合下,為什么GPU的速度能夠遠超CPU的原因。
