光線跟蹤演算法
1. optix 光線跟蹤可以放到unity裡面么
Unity5在圖形模擬和光照特效方面做了重大改變。自從3.0版本開始,Unity的光照效果一直局限於烘焙好的光照貼圖。但後續的時間里,我們在全局光照領域有了很大的提升與改進,現在,是時候將其中部分美好的特性從Unity的沙盒中開放出來了。其中之一的新圖形特性就是基於新的和極大改善的光照流程基礎上的全局實時光照。這也是本文的重點。
什麼是全局光照?
GI演算法是基於光傳輸的物理特性的一種模擬。他是一種模擬光在3D場景中各表面之間的傳輸的有效方式,他會極大的改善你游戲的模擬度。不僅如此,他還可以傳達一種意境,如果巧妙的使用,可以有效得改善你的游戲體驗。GI演算法不僅考慮光源的直射光,而且還考慮場景中其他材質表面的反射光。傳統上,在游戲中,由於實時性的約束,間接光照的模擬因性能消耗過大而被棄置一旁。
這些都是源於下面這個淺顯的方程:
這個很簡單。從某一觀察點看到的光是從場景中物體表面點入射的光(Le)與從觀察點上方的半球入射的光的疊加。Li描述的是從半球上某一角度w』 入射的光。反射項p描述的是光線如何反射到觀察點,這項的取值依賴於入射角w』和觀察者的角度w。
細心的讀者可能已經發現L(x,w)在方程的兩邊,而且有一個還在在積分式中。如果不是這種情形,我們也許已經計算出全局光照的結果。由於物理規律是不太可能去修改的,研究協會提出了一套解決方案。
其中最流行(最古老的)的是光線跟蹤演算法。這個演算法從根本上改善了GI演算法,在演算法最困難的部分使用了一些比較耗時的技巧。光線跟蹤在電影或者電視的CGI上使用了很多。盡管該領域涌現了大量的研究成果,但是一張圖像的渲染還是要花費數秒的時間(哪怕使用非常先進的GPU)。
光線跟蹤通常使用的是屏幕空間,所以,一張圖像每一幀都需要重新渲染。這意味著,他完全支持完全動態的場景:燈光、材料、幾何形狀自由變換的動畫。這也是一個缺點,因為每當攝像機移動的時候,一張新的圖片需要被渲染,而這張新圖像的收斂融合需要花費數秒鍾的時間。這也導致他無法適用於游戲場景。
一張沒有完全收斂融合的圖像會有很多噪點,而且他是時間不相乾的,所以,圖像在完全收斂融合之前會有嚴重的閃爍。可以使用濾波來降低這種影響,但是不能徹底消除。下面是一些在不同收斂融合程度的圖像。
2. 求光線跟蹤演算法技術 pdf
本書詳細闡述了與光線跟蹤問題相關的高效解決方案及相應的數據結構和演算法,主要包括采樣技術、投影視圖、視見系統、景深、非線性投影、立體視覺、光照與材質、鏡面反射、光澤反射、全局光照、透明度、陰影、環境遮擋、區域光照、光線與對象間的相交計算、對象變換、柵格技術以及紋理映射技術等內容。此外,本書還提供了相應的演算法、代碼以及偽代碼,以幫助讀者進一步理解計算方案的實現過程。
3. 光追和沒光追差別大嗎
光追和沒光追差別大。
該游戲就加入了光線追蹤效果,懸浮的獎勵道具在牆上的投影就是通過光學追蹤計算出來的,使得光源的真實感大大提高。
光源追蹤技術也遠非完美。計算出正確的反射和折射角度也不代表就能達到完全真實的視覺效果,因為光有顏色,不同顏色的光還會疊加等等,這些額外的計算也需要很好地演算法和大量的計算。
光學追蹤技術在3D游戲中的應用尚屬初級階段,DirectX 10為這種技術的發揮提供了良好的基礎,再加上新一代高性能顯卡的推出,相信在不久的將來就會有更真實的光影效果呈現在您眼前。
流行來源
光線跟蹤的流行來源於它比其它渲染方法如掃描線渲染或者光線投射更加能夠現實地模擬光線,象反射和陰影這樣一些對於其它的演算法來說都很難實現的效果,卻是光線跟蹤演算法的一種自然結果。
光線跟蹤易於實現並且視覺效果很好,所以它通常是圖形編程中首次嘗試的領域。
光線跟蹤的一個最大的缺點就是性能,掃描線演算法以及其它演算法利用了數據的一致性從而在像素之間共享計算,但是光線跟蹤通常是將每條光線當作獨立的光線,每次都要重新計算。
4. 高效光線跟蹤的演算法有那些
淺析3D Max中的高級燈光技術
摘要:3D Max在3D製作軟體中渲染功能一直比較薄弱,使其只甘居Maya等3D製作軟體之下。為彌補這一缺陷,在5.0版中3D Max增加了高級燈光技術,擁有光能傳遞、光線追蹤器兩個全局照明系統,在渲染功能上有了非常顯著的改善。本文主要介紹新的光能傳遞演算法。
關鍵詞:渲染 全局照明 光能傳遞
3D MAX 的渲染功能一直比較薄弱,其效果遠不如其他軟體(例如Maya)那樣逼真,這在很大程度上是因為3D MAX默認的燈光技術不夠先進。
在3D MAX中經常使用「光線追蹤(Ray-Trace)」材質,與之相聯系的就是光線追蹤渲染演算法。這種演算法假設發出很多條光線,光線遇到物體時,被遮擋、反射或者折射,通過跟蹤這些光線,就可以得到場景的渲染效果。但是這種方法有一個嚴重的缺點,就是不能反映現實生活中光的很多特性。例如,在現實生活中,燈光照射到物體後,每個物體都會發射一部分光線,形成環境光,從而導致沒有被燈光直射的物體也能被照明,而不是完全出於黑暗狀態。又如,把一個紅色物體靠近白色的牆壁,那麼牆壁靠近物體的地方會顯出也帶有紅色。還有很多諸如此類的燈光效果,使用光線追蹤演算法都不能產生。
為了解決這些問題,人們發明了更先進的演算法來計算燈光的效果,這就是「光能傳遞(Radiosity)」演算法。這種演算法把光作為光量子看待(實際上更符合現代物理學),通過計算光量子的能量分布獲得渲染結果。這種方法能夠獲得最逼真的照明效果,因此,通常將光能傳遞演算法和光線追蹤演算法結合起來,以獲得最佳的效果。3D MAX5.0新增的高級光照功能則包含了兩個不同的系統:光能傳遞(radiosity)和光線追蹤器(light tracer)。它所得到的結果非常接近對真實事物的再現。
光線追蹤器比較通用,也容易使用,使用它不需要理解許多技術概念,任何模型和燈的類型都適用。光能傳遞相對較復雜,需要為這種處理方式專門准備模型和場景。燈必須是光度控制燈,材質也必須仔細設計。但光能傳遞在物理上是精確的,對於建築模型的精確設計是必須的,這一點非常重要,尤其當建模的目的是進行光照分析時。另外,光線追蹤器的結果與視點無關,而光能傳遞不是這樣的。光線追蹤器在每一幀都計算光照。光能傳遞只會計算一次,除非場景中的物體移動了或燈發生了變化,或者是從另一個不同的視點渲染場景時。基本原則是光線追蹤器更適用於有大量光照的室外場景、角色動畫和在空曠的場景中渲染物體。光能傳遞更適合於使用了聚光燈的室內場景和建築渲染。
使用光線追蹤器進行室內光照模擬時,為避免平坦表面上的噪波,可能需要相當高質量的設定和很長的渲染時間。光能傳遞則可以用更短的時間提供更好的效果。另一方面,光能傳遞用於有許多多邊形的角色模型時,需要額外的細化步驟、過濾,甚至是Regathering(重新聚合)。而光線追蹤器適用默認的設置一次渲染就可以得到更好的效果。
傳統的渲染引擎值考慮直接光照
不考慮反射光,然而,反射光是
一個場景的重要組成部分。 對相同的場景使用全局光照渲染,
上圖使用了光能傳遞(radiosity)
就可以得到一種真實的結果。
光能傳遞是在一個場景中重現從物體表面反射的自然光線,實現更加真實和物理上精確的照明結果。如圖所示。光能傳遞基於幾何學計算光從物體表面的反射。幾何面(三角形)成為光能傳遞進行計算的最小單位。大的表面可能需要被細分為小的三角形面以獲得更精確的結果。場景中三角形面的數目很重要。如果數目不夠結果會不精確,但如果太多時間又會太長。光能傳遞提供一種將大的三角形面自動細分的方法,同時也可以控制每個物體的細分和細化程度。光能傳遞依賴於材質和表面屬性以獲得物理上精確的結果。在場景中進行建模時必須牢記這一點。要使用光度控制燈,而且模型的幾何結構應盡可能准確。
1.單位
要獲得精確的結果,場景中作圖單位是一個基礎。如果單位是「英寸」,一個100×200×96單位的房間可以被一個相當於60瓦燈泡的光度控制燈正確照明,但如果單位是「米」,相同場景會變得非常暗。
2.光能傳遞的解決方案
光能傳遞是一個獨立於渲染的處理過程,一旦解決方案被計算出來,結果被保存在幾何體自己內部。對幾何體或光照作改變將使原解決方案無效。解決方案是為整個場景全局計算的,這意味著它與視點無關。一旦計算出來,就可以從任何方向觀察場景。當攝像機在一個固定場景中移動時,這將會節省時間。如果對幾何體或燈作了動畫,每一幀都必須計算光能傳遞。渲染菜單中的選項允許定義如何處理光能傳遞過程。
。
5. 光線追蹤演算法中的光線是怎麼描述的
光線跟蹤思路:從視點出發,通過圖像平面上每個像素中心向場景發出一條光線,光線的起點為視點,方向為像素中心和視點連線單位向量.光線與離視點最近的場景物體表面交點有三種可能:當前交點所在的物體表面為理想漫射面,跟蹤結束. 當前交點所在的物體表面為理想鏡面,光線沿其鏡面發射方向繼續跟蹤. 當前交點所在的物體表面為規則透射面,光線沿其規則透射方向繼續跟蹤. 偽代碼: void TraceRay(const Vec3& start,const Vec3& direction,int depth,Color& color) { Vec3 intersectionPoint,reflectedDirection,transmittedDirection; Color localColor,reflectedColor,transmittedColor; if (depth >= MAX_DEPTH) { color = Black; //#000 } else { Ray ray(start,direction); //取start起點,方向direction為跟蹤射線; if ( !scene->HasIntersection(ray) ) color = BackgroundColor; else { 計算理起始點start最近的交點intersectionPoint, 記錄相交物體intersectionObject, // #1 Shade(intersectionObject,intersectionPoint,localColor); // #2 if ( intersectionPoint所在面為鏡面 ) { 計算跟蹤光想S在intersectionPoint處的反射光線方向reflectedDirection, TraceRay(intersectionPoint,reflectedDirection,depth+1,reflectedColor); } // #3 if ( intersectionPoint所在的表面為透明面 ) { 計算跟蹤光線S在intersectionPoint處的規則透射光線方向transmittedDirection, TraceRay(intersectionPoint,transmittedDirection,depth+1,transmittedColor); } // #summarize color = localColor + Ks * reflectedColor + Kt * transmittedColor; }// else } //else } // 局部光照模型計算交點intersectionPoint處的局部光亮度localColor void Shade(const Object& intersectionObj,const Vec3& intersectionPoint,Color& localColor) { 確定intersectionObj在intersectionPoint處的單位法向量N, 漫反射系數Kd, 鏡面反射系數Ks, 環境反射系數Ka; localColor = Ka * Ia; //Ia為環境光亮度 for ( 每一個點光源PointLight ) { 計算入射光線單位向量L和虛擬鏡面法向單位向量H, // 由Phong模型計算光源PointLight在intersectionPoint處的漫反射和鏡面反射光亮度 localColor += ( Ipointlight * ( Kd * (N.dot(L)) + Ks * (N.dot(H))^n ) ); } }
6. 光線跟蹤演算法中包含了哪些光照效果
光線跟蹤演算法性質是比光線投射,缺點是需要假設光線在觀察點處終止
7. 光線跟蹤演算法的例子
為了說明光線跟蹤所用的基本原理,我們來看計算一個光線與球體交點的例子。用 I 表示球面上的點,C 表示球心,r 表示半徑,那麼球面的公式為 . 如果定義一條線的起點即光線起點是 S,方向是 d,那麼線上的每個點都可以表示為
其中 t 是定義線上與起點距離的常數,為了簡化起見,通常 d 定義為單位矢量。那麼,在這種情況下已知 S、d、C 以及 r,於是代入 I 得到:
簡化 ,那麼
那麼二次方程的解是
這只是直線光線與球體交點的所用的數學公式,當然對於通用的光線跟蹤來說是遠遠不夠的,但是它至少表示了這個演算法如何使用的一個實例。
8. 寫出光線跟蹤演算法的基本過程.在光線跟蹤的遞歸程序中,遞歸終止條件有哪幾種
先來理解下概念:遞歸過程一般通過函數或子過程來實現。遞歸方法:在函數或子過程的內部,直接或者間接地調用自己的演算法。 充分必要條件是:問題具有某種可借用的類同自身的子問題描述的性質;某一有限步的子問題(也稱本原問題)有直接的解存在。 ...
9. 幫忙用openGL實現一個光線跟蹤
http://www.opengl.org/news/comments/implementing_ray_tracing_on_a_gpu_using_the_opengl_shading_language/
GPU的程序,自己看吧!