初入计算机图形学
?第一次寫博客,水平有限,錯誤之處也請指正~
計算機圖形學在于通過計算的方式渲染出模擬自然世界的一張擬真圖片,一般來講最直接的方式就是模擬大量光子在空間中的物理傳遞過程,但是這樣做的運算量極大。。。現在的電腦(一般是指個人計算機)還不能通過對光子的逐一模擬進而生成圖像。。
但是可以通過近似方式模擬。主要有輻射度方式的渲染(好像是類比熱力學里的平衡方程得到的渲染方式。。這里不太清楚),還有就是類似于上述的模擬光子行為的渲染方式。
由于光路可逆原理,模擬光子行為的方式又可分為正向光線跟蹤(光子從光源出發向整個場景傳遞)和逆向的光線跟蹤(從攝影機逐像素發出光線)。傳統的光線追蹤(raytrace)就是指逆向跟蹤。計算機渲染中真實感的體現是借助于所謂的全局光照(GI)算法來實現的,而在GI方面,上述的正向光線跟蹤的典型模式是光子貼圖(photon mapping,典型代表是vray渲染器),逆向的典型模式是類似于路徑追蹤(path tracing,典型代表為NVIDIA的Iray渲染器),光子貼圖在現在的很多三維建模軟件的配套渲染器里已經很常見了,像vray這種成熟的產品已經將photon mapping基本上是做到極致了,光子貼圖通過從光源發射一個一個光子與場景交互,然后經過反射,折射等等的過程最終消失在場景后留下的多個“印記”,把這些印記保存下來,光子記錄比較密的部位自然就是比較亮的地方,然后從攝影機發射光線,利用最鄰近查找去找那些離采樣點最近的多個光子進而決定相應像素點的顏色,整個圖像的精度取決于發射光子的個數與場景的復雜度。而路徑追蹤看起來就更暴力一點。。每個像素發射一條光線(比如要渲染一個800x600的圖,就得發射48萬條光線),每條光線與表面求交后,新的光線的方向取決于表面的材質參數(比如要是理想漫反射,新的方向就是在半球內的均勻采樣),新的方向繼續追蹤,下一輪追蹤之前保存一個BRDF,并與上一個BRDF相乘,直到擊中了一個發光物體(可想而知原始算法可能會效率比較低。。)這時候這條光線才被視為有效,沒擊中的話或者超過最大遞歸深度的話。。那這條光線對應的那個像素就對應黑色。一般來講,遍歷一次后整個圖像是很臟的(噪點太多,因為采樣光線的方向是隨機的,同一個像素的采樣光線在不同時刻的采樣值都可能不同,但是大量光線在同一像素的采樣平均值就基本上對應著正確的最終結果),這時候就需要一次又一次的迭代,每次結果都要與上一次混合后做平均,迭代幾千次(甚至要上萬次。。。)后得到一張收斂的圖片,其實這也就是iray的最基本的工作原理(當然遠不止這么簡單,人家畢竟是專業開發渲染器的,有很多降噪的算法,效率也很快,配上NV自己做的GPU來加速運算的話效率能快上一個數量級)。path tracing的渲染基本上是通過步進式渲染方式來完成的。
個人還是覺得path tracing實現上比較簡單一些,而傳統path tracing效率實在是。。有點低,所以后面有很多人對這個基礎算法做了改進,比如雙向路徑追蹤(bidirectional path tracing)類似的。
最后附上自己初試path tracing的幾張效果圖,可以看出噪點確實比較多。。日后還需要做好多學習和工作量去改進這個效率和噪點問題,還有現在只能實現簡單參數幾何體的渲染,后面還要考慮對復雜幾何體mesh的支持
(最后三張圖是一個場景分別進行10次迭代,1000次迭代和5000次迭代的圖像)
?
轉載于:https://www.cnblogs.com/time-flow1024/p/6773607.html
總結
- 上一篇: 微信公众号获取acess_token并存
- 下一篇: Gradle在大型Java项目上的应用