光能傳遞與光線追蹤的概念

Posted: 五月 15, 2007 in 電腦動畫

在網路上看到一篇解釋 ray trace與 radiosity 的文章, 經過這篇文章的整理, 我總算是理解了這兩者的概念了, 在個別看了ray trace與 radiosity 的原理說明之後, 再來看這篇, 有了一種豁然開朗的感覺.

以下為轉貼:

首先是關於三維圖形學中的兩個困難問題:
1. 光照模型: 一束光照到物體表面上的一點, 會發生什麼現象? 最簡單的一種情況就是均勻的漫反射, 出射的光強 = 入射的光強 * 漫反射係數 * cos(入射角),這叫Lambert模型(Lambert好像是一個18世紀的人). 還有很多複雜的模型, 可以描述鏡面反射/折射, 色散, 各向異性的反射率, 等等. 在三維軟件中一般用"材質"來表現.

2. 光的傳遞問題: 一個場景中的各個物體間在光的照射下, 會產生如何的相互作用? 也就是說, 光是如何來回傳遞的? 物體間相互作用而產生的現像有很多, 例如,陰影; 還有光在物體表面間相互傳遞所產生的間接照明. 由於是研究物體間的相互作用, 這個問題一般被稱為"全局照明"(Global Illumination); 相對的,光照模型研究單個點的光照, 也被稱為"局部照明".
一般來說, 為了解決"全局照明", 染色過程要分為兩個pass: 照明過程和採樣過程.radiosity(光能傳遞)是照明過程, 是最早被使用來解決"全局照明"的方法. 其它"全局照明"的方法還包括photon map等.

而raytrace是一種採樣算法, gauround, phong等算法也是. 實時圖形庫(像opengl)和早期的染色程序和都只有採樣過程, 無法產生"全局照明". 例如opengl中的陰影,並不是場景設定好了就會自動出現, 而一定要通過stencil buffer等方法來模擬.
對raytrace的簡要說明: 從觀察點所在的位置出發, 通過一個像素做一條射線. 追蹤這條射線, 如果這條射線和一個surface交於一點, 記下這一點, 再看看是否有鏡面反射/折射發生, 如果有, 從這一點產生新的反射/折射射線, 繼續追蹤. 這樣下去, 就生成了一棵二叉樹. 這個像素的亮度就是二叉樹所有節點的亮度和. 至於每個節點的亮度, 如果前面有照明過程的話, 就使用照明過程的結果, 否則可以直接按光照模型計算. 對圖像中所有像素重複以上過程, 就得到圖像. 注意, 追蹤的深度必須加以限定.這是最簡單的一種raytracing. raytracing有很多擴展算法, 如Monte-Carlo Raytracing, 可直接解決全局照明.
raytracing有一些優點: 不需要投影, 不需要消隱(raytracing本身就是消隱算法),不需要剪裁.對radiosity的簡要說明: 全局照明從數學上來看是這樣一個問題: 給定一個場景及其初始亮度分佈(就是光源啦), 求任意表面上任意一點的亮度. 這個問題可以寫成一個很簡單的積分方程, 稱為光的傳輸方程. 但這個方程很難解, 從數學上看,radiosity實際上是使用了有限元法來解這個方程.最簡單的一種radiosity算法是progressive radiosity: 1.把場景(包括光源)分割成大量的小多邊形, 稱為patch. 光源的光能處於未出射的狀態. 2.找到未出射光能最大的一個patch, 把它出射的光能加到其它所有的patch上: 從一個patch i發出的光能有百分之多少能到達另一個patch j, 這個參數稱為form factor.這個參數有很多種求法. 之後把這個patch的未出射光能設為零. 3. 反覆執行步驟2, 場景將由暗變亮, 逼近真實效果. 結果將存儲起來, 供以後的採樣算法, 如gauround, phong,raytracing等生成圖像使用.
progressive radiosity比較簡單, 但效率不高. 目前用的較多的是各種wavelet radiosity算法.
radiosity和raytracing並沒有完全解決上面提到的兩個圖形學的困難, 尤其是全局照明. 光的傳輸可以一個正則表達式來形象的說明, E代表眼睛, L代表光源, D表示漫反射/折射, S表示鏡面反射/折射, 那麼光從光源到眼睛的路程為L(D|S)*E, (*應該是上標, 這裡顯示不出), 單使用gauround(如opengl)只能計算LDS, 單使用raytracing:LDS*E, 單使用radiosity: LD*E, 先radiosity再raytrace: LD*S*E. 如果傳輸中出現…SD…, 這些方法就都不能解決. 例如, 一面鏡子會反射光線, 照亮其它物體. 這種現象稱為caustic, 實際上就是由鏡面反射/折射引起的間接照明.現在很多混合算法可以解決L(D|S)*E, 但是離實用還有一段距離.

P.S  caustic 現在已經有一種方法可以解決, 稱作 Phonto Map

 

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s