RayTracking 光线跟踪算法
轉(zhuǎn)自?http://www.cnblogs.com/daniagger/archive/2012/05/28/2521318.html ??詳細請看這位師兄的博客?
1. Irradiance(輻照度)
total amount of energy received per unit area of a surface
?
2. Illuminance(照明度)
essentially same as irradiance,the difference is that illuminance measures the amount of visible light energy in photometric terms
?
3. Radiance(輻射)
measure of energy that is reflected by the surface
?
4. Luminance(亮度)
measure of photometrically weighted light energy that leaves the surface
?
5. Luminous intensity
amount of light energy that is emitted by the surface in a given direction
反向光線追蹤步驟:
1、camera的膠片被分成離散的網(wǎng)格(即像素點),我們的目標是確定每一個像素點的顏色值。
2、對于每一個像素,從camera位置追蹤一條光線,指向該像素點
3、對于這束光線,判斷其是否和場景中的物體相交。如果相交,則轉(zhuǎn)到步驟4;否則,將背景色填充到當前像素中去,回到步驟2,繼續(xù)處理下一個像素。
4、如果光線和物體相交,計算物體表面交點的顏色值。該點的顏色值即為該像素的顏色值。
a、首先檢查每個光源在該交點的貢獻值。追蹤一條新光線去光源,用來確定交點是被全部照亮、部分照亮還是沒有被照亮,同時確定了陰影。
b、如果物體表面具有反射性質(zhì),計算初始光線的反射光線,然后追蹤這條反射光線,轉(zhuǎn)到步驟3。
c、如果物體表面具有折射性質(zhì),計算初始光線的折射光線,然后追蹤這條折射光線,轉(zhuǎn)到步驟3。
d、最終,根據(jù)表面性質(zhì)(反射率、折射率),和不同類型光線計算得出的顏色值,來確定交點的顏色值,即當前像素點的顏色值。
5、回到步驟2,繼續(xù)下一個像素點。重復這個過程直到像素點都遍歷完成。
[Raytracing]四種主要類型的追蹤光線
1、主光線(Primary rays)
從camera發(fā)出的光線。
2、陰影光線(Shadow/Light rays)
從交點發(fā)出的光線,指向光源。如果這條光線在指向光源之前不相交于任何物體,則這個光源對該交點有貢獻值;否則,該交點位于該光源的陰影處。
3、反射光線(Reflection rays)
如果物體表面具有反射性質(zhì),則部分光將會被反射出去,繼續(xù)在場景中前進。根據(jù)Snell定律,一條新的光線將會從交點發(fā)出。
4、折射光線(Refracted rays)
當物體表面具有折射性質(zhì)并且部分透明,部分光線將會進入物體繼續(xù)傳播。根據(jù)Snell定律,一條新的光線將會從交點發(fā)出進入物體。
[Raytracing]光線追蹤的問題和解決方案
問題:
1、性能
算法的遞歸性質(zhì)和大數(shù)目的追蹤光線,渲染過程可能持續(xù)數(shù)小時。80-90%的渲染時間花費在計算光線和物體交點上。
?
2、走樣
?
3、尖銳的陰影
基本的光線追蹤算法只能得到尖銳的陰影(因為模擬的是點光源)。
?
4、局部光照和著色
算法只追蹤少數(shù)目的光線,只有四種類型的光線被考慮在內(nèi),物體之間的漫反射光沒有被考慮在內(nèi),即算法并不包括全局光照。
?
解決方案:
1、性能
a、使用更多或者更好的硬件
b、大規(guī)模并行計算
每一個光線都相互獨立。
將圖像分割,分配在多核上或者分布式網(wǎng)絡上;或者分配在多個線程上。
c、限制交點檢測的數(shù)目
使用包圍盒的層次關系??焖倥袛喙饩€是否和一組物體相交。物體被分組在封閉的包圍盒中。利用空間細分技術:octree,BSP,grid.
d、優(yōu)化交點檢測
e、限制追蹤光線的數(shù)目
確定最大的遞歸層數(shù)。
根據(jù)光線對當前像素點貢獻值大小來限制遞歸深度。一個閾值用來確定后續(xù)光線由于對像素點貢獻太小而不會被追蹤。
?
?
2、走樣
使用超采樣(super sampling)、抗鋸齒(antialiasing)、jittering
a、追蹤額外的主光線并取平均值
即超采樣,相對于每一個像素點取一條光線,你可以取特定數(shù)目的光線。每一個像素被分為亞像素,對每一個亞像素發(fā)射一條光線。當所有的亞像素點都處理完畢,對亞像素點的顏色值取平均值,并將其賦值給該像素點。這種方法大大增加了渲染時間。
b、自適應抗鋸齒
在顏色劇烈變化的地方使用追蹤的主光線,顏色變化不大的地方使用最少的主光線。
c、隨機抗鋸齒
隨機取樣代替常規(guī)取樣。
?
3、尖銳的陰影
原因:使用點光源、每個交點僅僅對應一條陰影光線。
a、區(qū)域光(area light)
使用一系列點光源來模擬區(qū)域光源。對于每一個交點,需要和點光源數(shù)目一樣多的追蹤光線。
b、Monte Carlo光線追蹤法
使用隨機超采樣,光源建模成球形光源,陰影光線指向代表光源的球上面的點。陰影光線顏色的平均值決定該交點最終的顏色值。
4、全局光照
依舊可以使用Monte Carlo法。使用Radiosity算法。
[Raytracing]代碼框架
該偽代碼總結了光線追蹤算法。
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | Function Raytrace(Scene World){????for(each pixel of the image)????{?????????Calculate the ray corresponding to the pixel????????????(projection);?????????Pixel color=trace(ray,0);????}}color trace(Ray myRay,interger recurs_level){?????if(myRay intersects an object Obj)?????{?????????Calculate normal N at point of intersection Pi;?????????Calculate surface color SC at point of intersection Pi;?????????Final_Color=Shade(Obj,myRay,N,SC,Pi,recurs_level);?????}?????else?????{?????????Calculate background color BkgC;?????????Final_Color=BkgC;?????}?????return?Final_Color;}color Shade(Object obj,Ray myRay,Normal N,Surface_Color SC,Point Pi,integer recurslevel){?????recurslevel++;?????if(recurslevel>MAX_RECURSION_LEVEL)?????????return?0;???????????for(each light source)?????{?????????Calculate light ray(Pi points to light source);?????????if(light ray doesn't intersect an object)?????????{?????????????add light contribution to color based??????????????on the angle between light ray and myRay;?????????}?????}?????calculate reflect ray;?????refl_color=trace(refl_ray,recurslevel);?????calculate refract ray;?????refr_color=trace(refr_ray,recurslevel);???????????return?average(color,refl_color,refr_color);} |
[Raytracing]擴展光線追蹤
1、隨機采樣
在基本光線追蹤算法中,只追蹤有限數(shù)目的光線。這是一個采樣過程(sampling process)。
采樣有很多種方法:
a、均勻采樣
舉例:根據(jù)給定的區(qū)間繪制數(shù)學函數(shù)。
將區(qū)間劃分為許多小的寬度一致的小區(qū)間,在小區(qū)間的中點處計算函數(shù)的值,最終將這些點平滑連接出來。
在小區(qū)間數(shù)目很少的情況下,均勻采樣可能會得到錯誤的結果。
b、隨機采樣
使用隨機間隔寬度代替統(tǒng)一間隔寬度。
可以使用隨機采樣繪制平滑的陰影;繪制模糊的反射和折射;考慮景深;考慮運動模糊。
?
2、路徑追蹤
路徑追蹤算法考慮了全局光照問題。之前的光線追蹤只考慮了四種類型的光線,沒有哪一條光線考慮了物體之間的作用。
通過追蹤交點周圍所有路徑的光線來計算間接光照,為了避免無限渲染次數(shù),所有的可能光線路徑使用隨機采樣。這種方法的光線分布通常是半球形,中心點是交點。
渲染有天空光的戶外場景中,路徑追蹤算法非常有效率。因為這種場景下光變化的頻率不大,也就是說,采樣的函數(shù)值變化不大,小規(guī)模的采樣依然可以得到很好的效果。
雙向(Bidirectional)路徑追蹤額外追蹤了發(fā)自光源的光線,減少了路徑追蹤的采樣次數(shù)。
?
3、光子映射(photon mapping)
兩通道算法,考慮了全局光照和物體之間的反射,實現(xiàn)了caustics effect。
Pass 1-創(chuàng)建photon map
光線(光子)從光源開始追蹤,光子攜帶從光源散發(fā)的一部分能量。
當光子在場景中傳播時,可能被反射、穿透、吸收。
當光子擊中漫反射表面時,使用map存儲射進的能量。
photon map以k-d tree數(shù)據(jù)結構實現(xiàn)。
Pass 2-渲染階段
使用光線追蹤算法。在交點處,使用存儲在map中的信息去估計光照度。
總結
以上是生活随笔為你收集整理的RayTracking 光线跟踪算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: raymarching算法
- 下一篇: Ray Tracing,Ray Cast