基于CPU的光跟蹤算法
來源:投稿網(wǎng) 時間:2024-01-12 10:00:08
1.引言
近年來,CPU在計算能力和可編程性方面都有了很大的提高,GPU在需要大量計算的密集計算領(lǐng)域發(fā)揮了重要作用。基于CPU的各種密集計算被移植到GPU上,以利用GPU的巨大計算能力加速整個計算過程。光跟蹤算法是生成真實(shí)圖形的一種非常重要的方法。廣泛應(yīng)用于電影、游戲、廣告等行業(yè),光跟蹤算法也是典型的密集計算算法。使用基于CPU的原始光跟蹤渲染圖片是非常耗時的操作。因此,如果CPU上的光跟蹤算法能夠映射到CPU上,加快光跟蹤算法的實(shí)施時間,將帶來巨大的經(jīng)濟(jì)效益。因此,基于CPU的光跟蹤算法已成為國內(nèi)外研究人員的研究熱點(diǎn)。
2.基于GPU的光線跟蹤。
2.1相關(guān)工作。
目前,使用CPU加速光跟蹤算法主要有兩種方法。第一種是Carr和其他人提出將CPU轉(zhuǎn)換為一個蠻力的計算器來執(zhí)行光的一個三角形,并在CPU上完成任何光的生成和著色過程。這就要求CPU仍然執(zhí)行大部分渲染工作。Carr等人指出,在ATIradeon8500上,每秒最快可執(zhí)行1.2億次光的一個三角形。同時,作者還指出,由于GPU單精度浮點(diǎn)的限制,圖片中仍存在一些不真實(shí)的地方。
第二種方法是由Purcell和其他人提出的。改變方法將整個光跟蹤器移植到CPU進(jìn)行實(shí)現(xiàn)。GPU執(zhí)行從產(chǎn)生光線、加速結(jié)構(gòu)遍歷到最終著色過程。從那時起,許多相同的項目都是基于Purcell模型的。
2.2GPU上光跟蹤算法的映射模式。
將傳統(tǒng)CPU上執(zhí)行的光跟蹤算法映射成GPU協(xié)助或基于GPU的光跟蹤器有很多方法。以下是本文實(shí)現(xiàn)中提出的基于CPU的Whited模型的Purcell的映射模型和光跟蹤器。光跟蹤器的布局如圖2.1所示:
在Purcell的論文中,它將光的一三角形求交,以及遍歷過程分為兩個獨(dú)立的遍歷核和求交核。在本文的實(shí)現(xiàn)中,光跟蹤算法也根據(jù)上述模型圖分解為三個步驟:光生成、光一三角求交和著色。
在跟蹤光線之前,需要生成從視點(diǎn)指向屏幕的原始光線(primaryray)。在GPU上,光柵的插值能力可以在單核調(diào)用中產(chǎn)生所有原始光。
給定觀察矩形的四個角度和視點(diǎn)(用于生成圖片的投影平面的一部分)首先計算視錐的四個邊緣。如果光柵在這四種光之間按照512×512的規(guī)格插入,最終可以產(chǎn)生512×512圖片(像素和采樣點(diǎn))的所有原始光的方向。同時,這些方向可以存儲在一種紋理中,并將其作為內(nèi)核的輸入。所有的原始光都有相同的起點(diǎn),但仍然存儲在同一方向的紋理中,具有相同的維度。因為當(dāng)產(chǎn)生陰影光或反射光時,光的原點(diǎn)就會發(fā)生變化。
求交核心將光的原點(diǎn)、方向和場景描述作為輸入數(shù)據(jù)。核心被調(diào)用幾次后,我們將每個像素輸出一個擊中記錄。如果一條光擊中場景中的三角形,返回?fù)糁悬c(diǎn)的三個重心坐標(biāo)和相關(guān)擊中的三角形。此外,還將輸出發(fā)現(xiàn)的交叉點(diǎn)沿光線的距離和擊中三角形的材料。這需要五個浮點(diǎn)值來形成一個擊中記錄。紋理只能支持四個顏色通道(RCBA),因此如果擊中記錄可以減少到四個值,它將是非常有益的。
觀察發(fā)現(xiàn),只需要三個重心坐標(biāo)的兩個,因為在三角形內(nèi)部,它們總是加1個。這使得將交點(diǎn)記錄存儲在單獨(dú)的RGBA紋理中是可行的,其維度與其他兩個光紋理相同。
Moller和Trumbore提出了一種高效的光一三角求交算法,利用CPU在向量計算中的優(yōu)勢進(jìn)行求交計算。以下是求交代碼,也顯示了如何利用向量指令提高效率。
當(dāng)所有原始光都計算出交叉狀態(tài)時,您可以查詢著色過程所需的表面法線和材料信息。每個擊中記錄都存儲一個指向材料紋理的索引,包括三角形法線、材料顏色和類型。根據(jù)擊中記錄的中心坐標(biāo)插入三個頂點(diǎn)的法線。最終顏色可以根據(jù)(N-L)C計算,這里是法線,L是光源的方向,G是三角形的顏色。
目前,根據(jù)擊中三角形的材料類型(漫反射材料或鏡面反射材料),需要產(chǎn)生二次光來計算陰影和反射。
1)如果光線射出場景,像素將被賦予整體背景色。
2)如果一條光擊中一個漫反射材料表面,就會發(fā)射陰影射線(shdowray)。這些光的起點(diǎn)是擊中點(diǎn),方向是從擊中點(diǎn)指向光源。
3)如果一條光擊中了鏡面反射材料的表面。發(fā)射鏡面反射光。鏡面發(fā)射光的起點(diǎn)也在擊中點(diǎn),但其方向是關(guān)于入射光和插值后的法線對稱方向。一個真正的Whited類型的光跟蹤器也支持透明材料,從而產(chǎn)生折射光。但由于主要研究加速結(jié)構(gòu),本文沒有考慮折射光。
4)如果陰影光擊中一個幾何體,則表明在光源和擊中點(diǎn)之間存在一個幾何體,因此該像素應(yīng)為黑色(在陰影中)。當(dāng)跟蹤陰影光時,不要關(guān)心最近的擊中點(diǎn),而是更關(guān)心是否有這樣的擊中點(diǎn)。因此,當(dāng)發(fā)現(xiàn)交叉點(diǎn)時,可以停止整個交叉過程,從而加速算法的處理過程。在本文的實(shí)現(xiàn)中,以同樣的方式跟蹤陰影光和反射光,因此沒有使用此優(yōu)化策略。
每個像素已經(jīng)產(chǎn)生了正確的二次光。如有必要,可執(zhí)行另一個歷程/交付過程,跟蹤上述二次光。每次調(diào)用著色程序,每個像素都可以返回一個顏色值和一個新的光。著色核心還可以將上一個著色程序的輸出作為著色程序的輸入。這使得這些連續(xù)鏡面反射的顏色可以在跟蹤連續(xù)光時合并。
與Carr等人的程序不同,本文采用的程序沒有浮點(diǎn)精度過低的問題,因為Ceforce7300支持整個管道中真正的32個浮點(diǎn)操作。