【前言】
? ? ? ? CORONA渲染器使用路徑追蹤來渲染圖像。什么是路徑追蹤呢赞警?路徑追蹤是一種渲染算法妓忍,它通過跟蹤來自攝像機(jī)的獨(dú)立光路來計(jì)算最終圖像。
? ? ? ? 本來我想洋洋灑灑寫一篇通俗易懂的文章愧旦,后來世剖,我在網(wǎng)上看到了一位從事動(dòng)畫電影特效工作的網(wǎng)友,他寫的一篇關(guān)于路徑追蹤文章笤虫,內(nèi)容非常好搁廓。我感覺那就是我想寫的文章,這使我無法動(dòng)筆了耕皮。所以境蜕,特意去掉的C++語言部分,部分轉(zhuǎn)載給大家凌停。
【轉(zhuǎn)載】
轉(zhuǎn)載地址:http://ymuhua.com
? ? ? ?光線追蹤的渲染技術(shù)已經(jīng)被大量運(yùn)用到現(xiàn)在的電影產(chǎn)業(yè)中粱年,我們身邊也出現(xiàn)了大量光線追蹤的渲染器,Arnorld罚拟,Vray台诗,Houdini的mantra,Maxwell赐俗、Corona等等拉队。它出現(xiàn)的目的也是為了追求更真實(shí)的物理效果。
? ? ? ? 光線追蹤算法中,一個(gè)物體要被觀察者(camera)看到要具備兩個(gè)因素叔扼。其一事哭,就是要有光,物體不被光照到我們是看不到瓜富,其二鳍咱,就是當(dāng)然要有物體,光被物體反射入觀察者眼中才能被看到与柑。所以谤辜,光線追蹤算法就是計(jì)算光線和物體交互蓄坏,碰撞檢測的算法。
? ? ? ? ?光線追蹤算法分為兩種:正向追蹤算法和反向追蹤算法丑念。其中涡戳,正向追蹤算法是大自然的光線追蹤方式,即由光源發(fā)出的光經(jīng)環(huán)境景物間的多次反射渠欺、透射后投射到景物表面,最終進(jìn)入人眼椎眯。
? ? ? ? 反向追蹤算法正好相反挠将,它是從觀察者的角度出發(fā),只追蹤那些觀察者所能看見的表面投射光编整。就目前而言舔稀,所有3D制作軟件的光線追蹤算法都是采用反向追蹤法,原因是這種算法能夠最大程度地節(jié)省計(jì)算機(jī)的系統(tǒng)資源掌测,而且不會(huì)導(dǎo)致渲染質(zhì)量的下降内贮。
? ? ? ? 為什么反向追蹤快呢?我們玩走迷宮汞斧,是正走快夜郁,還是反走快?
? ? ? ? 反向追蹤法就是從觀察者開始向場景中射出光線粘勒,當(dāng)光射出后打到物體上后竞端,我們?cè)購哪莻€(gè)被擊中的點(diǎn)所在表面在射出光線(我們假設(shè)稱作陰影光線或光源光線)。如果這光源光線被射出后遇到了場景中的光源庙睡。那么我們就能看到這個(gè)物體事富,又或者這光源光線又打到了另外一個(gè)物體上 ,那么我們看到的這個(gè)物體就在陰影中乘陪。
? ? ? ? 接下來我們來介紹柵格化(Rasterization)统台。就是將圖轉(zhuǎn)化為一個(gè)個(gè)柵格組成的圖象
? ? ? ? 為什么要柵格化,因?yàn)槲覀冎牢覀兊碾娔X屏幕是由像素點(diǎn)組成啡邑。目前主流的像素已經(jīng)1920*1080贱勃。也就是說,我們的屏幕橫向有1920個(gè)像素谤逼,然后叢向有1080個(gè)像素點(diǎn)募寨。
? ? ? ? 所以拔鹰,我們要將三維的模型投射到屏幕上面,然后將每個(gè)像素點(diǎn)填充上一個(gè)相對(duì)硬的顏色贵涵,就好比一個(gè)圓是由多個(gè)網(wǎng)格組成列肢。當(dāng)然了恰画,網(wǎng)格細(xì)分越高,顯示精度也越好瓷马。
? ? ? ? 光線追蹤的靈魂所在就在于光線拴还。所以,我們基于屏幕的每個(gè)像素點(diǎn)射出去一個(gè)光線欧聘。如果射出去的光線碰到了障礙物(模型)片林,我們就能將這個(gè)像素點(diǎn)填充上相應(yīng)障礙物的信息(根據(jù)燈光,物體材質(zhì))怀骤。如果什么都沒碰到费封,那么相對(duì)因的像素就什么都不顯示(背景顏色)。
? ? ? ? 現(xiàn)在我們知道了蒋伦,每個(gè)像素到底看到了什么弓摘。然后我們通過重復(fù)的遍歷屏幕上的每個(gè)點(diǎn),那么一個(gè)球就出現(xiàn)在屏幕上了痕届。是不是很好理解韧献?
好了,下面我用為代碼來簡單介紹一下一個(gè)簡單的渲染器的工作流程研叫。省略........
? ? ? ?影響一個(gè)像素點(diǎn)顏色由三個(gè)通道來表示锤窑,R(紅),G(綠)嚷炉,B(藍(lán))也就是這三個(gè)通道來表示果复,我們知道通過這三個(gè)顏色組合,我們可以得到所有的顏色渤昌。比如紅色+藍(lán)色=紫色虽抄。
? ? ? ?我們現(xiàn)在定義每個(gè)顏色通道為8位,也就是2^8独柑。他表示范圍為0-255迈窟。0表示最小值,255表示最大值忌栅。所以
黑色:0车酣,0,0
紅色:255索绪,0湖员,0
綠色:0,255瑞驱,0
藍(lán)色:0娘摔,0,255
白色:255唤反,255凳寺,255
那么問題來了鸭津,如何來決定某個(gè)像素的值呢:
? ? ? 它由多個(gè)因素來決定的。請(qǐng)看下圖:
? ? ? ?我們簡單來分析: 首先一束光射出去肠缨,我們打到一個(gè)物體上逆趋,
? ? ? ? 如果打到一個(gè)物體向光面上,那么我們會(huì)根據(jù)物體的材質(zhì)(物體本體顏色晒奕,對(duì)光的漫反射闻书,對(duì)其他物體的反射)來計(jì)算像素點(diǎn)材質(zhì)。
? ? ? ?如果打到一個(gè)背光面上脑慧,那么這就是陰影魄眉。
? ? ? ?如果什么都沒打到那么,那么他就是個(gè)背景顏色漾橙。
? ? ? ? 畢竟在光線追蹤影響物體顏色的因素太多了杆融,因?yàn)楣饩€是在空間中不停的反彈楞卡。有直接反射霜运,間接反射,理論上來說如果計(jì)算時(shí)間足夠長蒋腮,那么得到的結(jié)果就無限接近真實(shí)效果淘捡,但是時(shí)間和效果往往是矛盾的,我們?nèi)绾卧谟邢薜臅r(shí)間中得到盡量真實(shí)的效果就是我們之后要做的池摧。
【后記】
? ? ? ?看完這篇圖文并茂的文章焦除,你是否明白CORONA渲染器的光線追蹤是怎么回事了吧?再次感謝作者的好文章作彤。喜歡的朋友可以到該作者的網(wǎng)站上去看他更多的文章膘魄。
轉(zhuǎn)載地址:http://ymuhua.com/2016/01/04/introraytracing/