<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 消費電子 > 設計應用 > 光線(xiàn)追蹤技術(shù)的理論和實(shí)踐(面向對象)

光線(xiàn)追蹤技術(shù)的理論和實(shí)踐(面向對象)

作者: 時(shí)間:2013-07-23 來(lái)源:網(wǎng)絡(luò ) 收藏

介紹

本文引用地址:http://dyxdggzs.com/article/164673.htm

這篇文章將介紹。在計算機圖形領(lǐng)域中,這種被普遍應用于生成高質(zhì)量的照片級圖像。在為一個(gè)場(chǎng)景計算光照的時(shí)候,通過(guò)固定圖形渲染管線(xiàn)可以計算phong光照模型,由于該模型的特征,使得渲染的物體看起來(lái)有塑料的質(zhì)感。如果要渲染一個(gè)有金屬質(zhì)感且能反射周?chē)h(huán)境的物體,phong模型就無(wú)能為力了。和固定渲染管線(xiàn)相比,可編程圖形渲染管線(xiàn)的力能要強的多,雖然可以實(shí)現很多逼真的光照效果,比如利用環(huán)境貼圖來(lái)現實(shí)物體對環(huán)境的反射效果。但是這種環(huán)境反射只能反射出已經(jīng)保存在Cube Map中的圖像。在真實(shí)世界中,如果一個(gè)能反射周?chē)h(huán)境的物體周?chē)€有很多其他物體,它們就會(huì )相互反射。一般的環(huán)境貼圖達不到這樣的效果,于是在渲染照片級畫(huà)面的時(shí)候,就要用到的技術(shù)。文本還將利用c++的方法來(lái)實(shí)現。

原理

在介紹原理之前,先考慮一個(gè)問(wèn)題:我們是怎樣看到真實(shí)世界中的物體的?我們能看到物體,是因為該物體上有反射光線(xiàn)到達我們的眼睛。沒(méi)有任何光線(xiàn)傳入眼睛,我們就看不到任何東西。我們還經(jīng)??吹揭粋€(gè)物體表面能反射另一個(gè)物體。這也是因為被反射物體表面的反射光線(xiàn)到達該物體表面后,該物體繼續將光線(xiàn)反射到我們的眼睛里,于是我們看到了該物體表面反射其他物體的效果?,F在,我們將從物體表面出發(fā)最后到達眼睛的光線(xiàn)的方向反向。先來(lái)看看下面的Fig1,在Fig1中是一個(gè)虛擬的場(chǎng)景,場(chǎng)景中有2個(gè)球和1個(gè)圓錐,白色的點(diǎn)代表光源,中間四邊形就是虛擬屏幕,屏幕上一個(gè)一個(gè)的小方格就代表像素,相機的位置代表觀(guān)察者眼睛的位置。

(a)

(b)

Fig1 光線(xiàn)追蹤場(chǎng)景

光線(xiàn)追蹤的原理就是從相機的位置發(fā)出一條條通過(guò)每一個(gè)像素的射線(xiàn),如果該射線(xiàn)和場(chǎng)景中的物體相交,那么就可以計算出該交點(diǎn)的顏色,這個(gè)顏色就是對應的像素的顏色。當然,計算像素顏色的時(shí)候首先要計算出交點(diǎn)處所有與光照計算相關(guān)量,比如法線(xiàn),入射光線(xiàn)和反射光線(xiàn)等等。

(a)

(b)

Fig2 光線(xiàn)和空間物體相交

在Fig2中可以看到,從相機出發(fā)的射線(xiàn)依次穿過(guò)每一個(gè)像素,圖中顯示出其中的三條。這些射線(xiàn)都與物體有交點(diǎn),不同物體的交點(diǎn)計算方法也不一樣。射線(xiàn)與平面的交點(diǎn)計算方法和射線(xiàn)與球的交點(diǎn)計算方法是截然不同的。為了計算方便,這里就只以球為例。如果一個(gè)物體可以反射周?chē)沫h(huán)境,那么當一條射線(xiàn)與該物體相交后,射線(xiàn)還會(huì )在該點(diǎn)產(chǎn)生反射和折射等。例如在Fig2中,當射線(xiàn)和藍色球相交后,光線(xiàn)會(huì )反射,反射的光線(xiàn)又可能和橙色圓錐和綠色球相交,所以我們能在藍色球的表面看到橙色的圓錐和綠色球。整個(gè)光線(xiàn)追蹤的原理就是這么簡(jiǎn)單,但是實(shí)際操作起來(lái)又有很多要注意的地方。

的方法來(lái)實(shí)現光線(xiàn)追蹤比使用結構要來(lái)的容易一些。因為在光線(xiàn)追蹤的整個(gè)過(guò)程中,比較容易抽象出的共同特征,比如我們可以抽象出射線(xiàn),物體,光源,材質(zhì)等等。當然,最最基本的一個(gè)類(lèi)就是向量類(lèi),在計算光照的時(shí)候向量很重要。在這里我們假設已經(jīng)實(shí)現了一個(gè)三維向量類(lèi)GVector3,該類(lèi)提供所有有關(guān)向量的操作。

除了向量,我們最先能想到一個(gè)關(guān)于射線(xiàn)的類(lèi),叫CRay。

對于一條射線(xiàn)最基本的就是它的出發(fā)點(diǎn)和方向,所以在CRay的類(lèi)圖中,能看到兩個(gè)私有成員變量m_Origin和m_Direction,它們都是GVector3類(lèi)型。由于類(lèi)的設計原則要滿(mǎn)足數據的封裝性,既然射線(xiàn)的出發(fā)點(diǎn)和方向都是私有的,那么就要提供公共的成員方法來(lái)訪(fǎng)問(wèn)它們,于是我們還需要set和get方法。最后,getPoint(double)方法是通過(guò)向射線(xiàn)的參數方程傳入參數t而獲得在射線(xiàn)上的點(diǎn)。實(shí)現了射線(xiàn)CRay類(lèi)后,那么在使用光線(xiàn)追蹤計算每個(gè)像素顏色的時(shí)候,對于每一個(gè)像素都要創(chuàng )建一個(gè)CRay的實(shí)例。

for(int y=0; y=ImageHeight; y++)

{

for(int x=0; x=ImageWidth; x++)

{

double pixel_x = -20.0 +40.0/ImageWidth*x;

double pixel_y = -15.0 +30.0/ImageHeight*y;

GVector3 direction = GVector3(pixel_x, pixel_y,0)-CameraPosition;

CRay ray(CameraPosition, direction);

// call RayTracer function

}

}

從上面的代碼可以看到,兩個(gè)for循環(huán)用于掃描每一個(gè)像素,然后在循環(huán)里計算出每個(gè)像素的位置。如果我們假設Fig1中,四邊形屏幕處于xy平面,長(cháng)和寬分別是40和30,且左上頂點(diǎn)坐標和右下頂點(diǎn)坐標分別為(-20,15,0)和(20,-15,0)。為了將該屏幕映射到實(shí)際分辨率為800*600的窗口上,就要求出虛擬屏幕上每個(gè)像素的坐標pixel_x和pixel_y。然后對每一個(gè)像素都用一條射線(xiàn)穿過(guò)它,射線(xiàn)的方向自然就是像素的位置和相機位置的差向量的方向。要注意一點(diǎn),實(shí)際窗口的分辨率比例要和虛擬屏幕長(cháng)寬比例保持一致,這樣渲染出來(lái)的畫(huà)面看起來(lái)長(cháng)寬比例才正確。

現在我們來(lái)考慮在場(chǎng)景中的物體。一個(gè)物體可能有很多可以描述它的特征,比如形狀,大小,顏色,材質(zhì)等等。使用面向對象的方法,就需要將這些物體的共同特征抽象出來(lái)。下面是一個(gè)抽象出來(lái)的物體類(lèi)GCObject。

c++相關(guān)文章:c++教程



上一頁(yè) 1 2 3 4 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>