本發(fā)明屬于計(jì)算機(jī)圖形學(xué)領(lǐng)域,特別涉及一種基于GPU的光線跟蹤方法。
背景技術(shù):
光線跟蹤方法用于生成逼真的三維虛擬場(chǎng)景,是計(jì)算機(jī)圖形學(xué)核心之一。自提出之日起發(fā)展至今,已經(jīng)被廣泛應(yīng)用于影視制作、三維仿真、計(jì)算機(jī)輔助設(shè)計(jì)等領(lǐng)域,并且極大的促進(jìn)了虛擬現(xiàn)實(shí)技術(shù)的進(jìn)步。該方法是一項(xiàng)基于幾何光學(xué)的通用技術(shù),它通過跟蹤與物體發(fā)生交互作用的光線,從而得到光線在物體表面產(chǎn)生的反射、散射等現(xiàn)象的路徑,用以模擬生成真實(shí)的虛擬場(chǎng)景,被認(rèn)為是圖形處理的未來方向。光線跟蹤方法需要跟蹤場(chǎng)景中的每一條光線,由此涉及到每一條光線的折射、反射,并最后完成投影、可見面判定和著色三方面的任務(wù),這導(dǎo)致了成像過程中計(jì)算開銷的增大。尤其在大型復(fù)雜場(chǎng)景中,光線與物體相交次數(shù)多,并且由于物體表面材質(zhì)的不同使得光線傳播路線復(fù)雜,這都導(dǎo)致了計(jì)算開銷的劇增。因此,計(jì)算密集且費(fèi)時(shí)費(fèi)力成為光線跟蹤發(fā)展的重大障礙。
提高光線跟蹤的效率一直是該領(lǐng)域研究的重點(diǎn)。目前,這類問題的研究主要分為兩個(gè)方向:一是改進(jìn)空間加速結(jié)構(gòu),提高光線在場(chǎng)景中求交的速度;二是利用計(jì)算機(jī)硬件的并行原理,加快光線跟蹤算法的執(zhí)行速度。文獻(xiàn)“啟發(fā)式探查最佳分割平面的快速KD—Tree構(gòu)建方法”,提出了一種基于分區(qū)(binning)算法的快速構(gòu)建方法,該方法首先通過分析kd—tree的成本函數(shù),啟發(fā)式地定位了當(dāng)前節(jié)點(diǎn)的分割平面所在的子區(qū)間;其次,對(duì)探查到的子區(qū)間進(jìn)行進(jìn)一步的細(xì)化采樣(sub-sampling),使得到的分削平面更好地逼近最優(yōu)分割位置,但是文章實(shí)現(xiàn)的是算法的單線程版本,未對(duì)內(nèi)存管理進(jìn)行優(yōu)化,未充分利用計(jì)算機(jī)并行處理的優(yōu)勢(shì),還有很大的提高空間。文獻(xiàn)“基于物理的分布并行光線跟蹤算法”針對(duì)斯坦福大學(xué)經(jīng)典的多線程光線跟蹤引擎——PBRT,提出了動(dòng)態(tài)自適應(yīng)分布式并行光線跟蹤方法,首先利用裁剪窗口概念設(shè)計(jì)了為每個(gè)計(jì)算節(jié)點(diǎn)分配任務(wù)的方法,為計(jì)算機(jī)集群分布并行光線跟蹤提供了粗粒度渲染單元;然后過分析比較分布式光線跟蹤方法中靜態(tài)和動(dòng)態(tài)任務(wù)調(diào)度策略的優(yōu)缺點(diǎn),提出了一種靜態(tài)和動(dòng)態(tài)相結(jié)合的任務(wù)分配策略,提高了節(jié)點(diǎn)間的負(fù)載均衡度,該方法具有良好的效率和擴(kuò)展性,提高了光線跟蹤方法的并行度,但是算法單純利用CPU集群,未考慮使用GPU提高渲染效率。
可見上述方法中雖然對(duì)很大程度上提升了傳統(tǒng)光線跟蹤的效率,但在當(dāng)今計(jì)算機(jī)架構(gòu)下,未能充分發(fā)揮計(jì)算機(jī)的性能,在實(shí)際的應(yīng)用過程中卻存在著渲染效率低的問題,不能滿足現(xiàn)實(shí)需求。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)存在的問題,本發(fā)明提供一種基于GPU的光線跟蹤方法。
本發(fā)明的技術(shù)方案如下:
一種基于GPU的光線跟蹤方法,包括:
步驟1:CPU端加載場(chǎng)景模型,解析得到三角片元信息、材質(zhì)信息、光源信息后打包發(fā)送給GPU端;
步驟2:GPU端得到三角片元信息、材質(zhì)信息、光源信息,分別存儲(chǔ)到對(duì)應(yīng)的全局存儲(chǔ)器和常量存儲(chǔ)器;
步驟3:GPU端建立以整個(gè)3D場(chǎng)景的場(chǎng)景模型為根節(jié)點(diǎn)的Kd-Tree;
步驟4:GPU端進(jìn)行光線跟蹤操作;
步驟5:CPU端進(jìn)行后期圖像處理:CPU端讀取圖像緩存區(qū)的像素信息,顯示到屏幕,完成渲染。
所述步驟1,包括:
步驟1.1:CPU端開辟內(nèi)存或顯存空間,將場(chǎng)景模型加載到內(nèi)存或顯存空間中;
步驟1.2:CPU端對(duì)場(chǎng)景模型進(jìn)行解析,得到三角片元信息、材質(zhì)信息、光源信息;
步驟1.3:將解析好的三角片元信息、材質(zhì)信息、光源信息分別打包發(fā)送到GPU端。
所述步驟3,包括:
步驟3.1:建立3D場(chǎng)景中的各個(gè)場(chǎng)景模型的包圍盒及整個(gè)3D場(chǎng)景模型的包圍盒;
步驟3.2:以整個(gè)3D場(chǎng)景模型的包圍盒為根節(jié)點(diǎn),自上而下進(jìn)行分割,建立以Kd-Tree。
所述步驟3.2,包括:
步驟3.2.1:分別將整個(gè)3D場(chǎng)景模型的包圍盒沿著不同軸向分割成兩個(gè)子空間即得到左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn),分別劃入左子樹、右子樹;
步驟3.2.2:計(jì)算不同軸向的分割成本C(V)≈Kt+Ki(PL Nl+ PR Nr),Nl,Nr為左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn)中的場(chǎng)景模型包圍盒數(shù)量,Kt、Ki為常數(shù),PL、PR為光線進(jìn)入左子樹、右子樹的概率,PL=SA(VL)/SA(V),SA(VL)表示左孩子節(jié)點(diǎn)中的場(chǎng)景模型包圍盒的表面積和,SA(V) 表示3D場(chǎng)景中的所有場(chǎng)景模型包圍盒的表面積和,PR=SA(VR)/SA(V),SA(VR)表示右孩子節(jié)點(diǎn)中的場(chǎng)景模型包圍盒的表面積和;
步驟3.2.3:選擇最小的分割成本對(duì)應(yīng)的軸向分割平面,將整個(gè)3D場(chǎng)景模型的包圍盒分割為左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn);
步驟3.2.4:對(duì)步驟3.2.3中分割得到的左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn)均執(zhí)行步驟3.2.1~3.2.3;
步驟3.2.5:判斷是否到達(dá)最大分割深度或左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn)內(nèi)部三角片元數(shù)均小于指定閾值,是則停止繼續(xù)分割,當(dāng)前的分割結(jié)果即建立的Kd-Tree;否則執(zhí)行步驟3.2.1。
所述步驟4,包括:
步驟4.1:初始化光線簇:根據(jù)3D場(chǎng)景中的相機(jī)位置生成光線,作為光線簇,存儲(chǔ)在光線簇緩存區(qū);
步驟4.2:判定當(dāng)前光線是否與Kd-Tree的包圍盒相交:如果相交,則進(jìn)行包圍盒內(nèi)部的場(chǎng)景模型與當(dāng)前光線的相交測(cè)試,執(zhí)行步驟4.3;否則當(dāng)前光線不與Kd-Tree的包圍盒內(nèi)部的場(chǎng)景模型相交,將該場(chǎng)景模型作為背景信息填充到圖像緩存區(qū);
步驟4.3:如果當(dāng)前光線與包圍盒內(nèi)部的場(chǎng)景模型相交,則根據(jù)光源位置判斷交點(diǎn)的可見性:如果光源被遮擋,則交點(diǎn)不可見,如果光源未被遮擋,則記錄該交點(diǎn)處為光照處,并將該交點(diǎn)填充到圖像緩存區(qū);如果當(dāng)前光線與包圍盒內(nèi)部的場(chǎng)景模型不相交,則將該場(chǎng)景模型作為背景信息填充到圖像緩存區(qū);
步驟4.4:根據(jù)交點(diǎn)處場(chǎng)景模型的光線信息計(jì)算反射光線,并將反射光線設(shè)為當(dāng)前光線,繼續(xù)追蹤;
步驟4.5:當(dāng)前光線簇緩存區(qū)非空且未到達(dá)最大遍歷深度,返回步驟4.2,對(duì)光線簇緩存區(qū)中的下一條光線進(jìn)行追蹤;否則停止追蹤。
有益效果:
本發(fā)明中CPU端加載場(chǎng)景模型,解析得到三角片元信息、材質(zhì)信息、光源信息后打包發(fā)送給GPU端,分別存儲(chǔ)到對(duì)應(yīng)的全局存儲(chǔ)器和常量存儲(chǔ)器;GPU端建立以整個(gè)3D場(chǎng)景的場(chǎng)景模型為根節(jié)點(diǎn)的Kd-Tree;進(jìn)行光線跟蹤操作;CPU端進(jìn)行后期圖像處理。通過合理調(diào)用CPU和GPU協(xié)同工作提高光線跟蹤效率。與傳統(tǒng)的CPU渲染相比,渲染效率有明顯提高,能夠在較短時(shí)間內(nèi)完成相同效果的模型渲染工作。Kd-Tree的應(yīng)用能夠提高光線跟蹤時(shí)光線求交的效率,而GPU的使用,是利用其大規(guī)模并行執(zhí)行的優(yōu)勢(shì),在光線跟蹤時(shí)能夠多條光線并行執(zhí)行,提高光線跟蹤效率。
附圖說明
圖1是光線跟蹤原理示意圖;
圖2是本發(fā)明具體實(shí)施方式中所采用的系統(tǒng)框架圖;
圖3是本發(fā)明具體實(shí)施方式中基于GPU的光線跟蹤方法流程圖;
圖4是本發(fā)明具體實(shí)施方式中的場(chǎng)景模型Dragon;
圖5是本發(fā)明具體實(shí)施方式中Kd-Tree示意圖,(a)是 Kd-Tree對(duì)應(yīng)二維數(shù)據(jù)集合的一個(gè)空間劃分示意圖,(b)是構(gòu)建的Kd-Tree示意圖,(c)是構(gòu)建的Kd-Tree在三維空間的應(yīng)用示意圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式做詳細(xì)說明。
本實(shí)施方式原理如圖1所示:在光線跟蹤中,跟蹤的方向與光傳播的方向相反。即光線首先從視點(diǎn)(攝像機(jī))處出發(fā),射向虛擬場(chǎng)景中。若光線與場(chǎng)景中的物體沒有交點(diǎn),則光線將射出平面,追蹤結(jié)束。反之,光線在場(chǎng)景中物體表面最近的交點(diǎn)處走向有以下三種可能:交點(diǎn)具有理想漫反射性質(zhì),采用漫反射方向追蹤;交點(diǎn)具有理想鏡面性質(zhì),光線順著鏡面反射方向繼續(xù)追蹤;交點(diǎn)是規(guī)則透射點(diǎn),光線順著投射方向繼續(xù)追蹤。光線跟蹤是一個(gè)遞歸的過程,當(dāng)滿足下述條件之一即可終止:光線與場(chǎng)景中的物體沒有交點(diǎn);光線對(duì)像素的貢獻(xiàn)值小于某個(gè)預(yù)先設(shè)定的閾值;當(dāng)前遞歸的深度超過了最大追蹤深度。
本實(shí)施方式采用如圖2所示的系統(tǒng),包括GPU端和CPU端。CPU端負(fù)責(zé)3D模型解析和后期圖像處理后輸出,GPU端負(fù)責(zé)加速結(jié)構(gòu)Kd-Tree的創(chuàng)建和光線跟蹤操作。系統(tǒng)流程如圖3所示.場(chǎng)景模型首先由CPU端處理,主機(jī)端開辟內(nèi)存/顯存空間,將場(chǎng)景模型加載到內(nèi)存中;然后CPU對(duì)場(chǎng)景模型進(jìn)行解析;將模型信息解析為三角片元數(shù)據(jù)、材質(zhì)數(shù)據(jù)和光源信息,再分別打包發(fā)送到GPU端;GPU端將三角片元信息、材質(zhì)信息、光源信息,分別存儲(chǔ)到對(duì)應(yīng)的全局存儲(chǔ)器和常量存儲(chǔ)器;并建立以各場(chǎng)景模型的包圍盒為葉子節(jié)點(diǎn)、整個(gè)3D場(chǎng)景的場(chǎng)景模型為根節(jié)點(diǎn)的Kd-Tree;然后進(jìn)行光線跟蹤操作。
本發(fā)明利用CUDA框架在GPU上實(shí)現(xiàn)光線跟蹤,CUDA(Compute Unified Device Architecture,統(tǒng)一計(jì)算設(shè)備架構(gòu))是NVIDIA公司推出的編程模型,可以在應(yīng)用程序中充分利用CPU和GPU各自的優(yōu)點(diǎn),使得利用GPU的計(jì)算性能顯著提升,調(diào)用CPU與GPU協(xié)同處理。
一種基于GPU的光線跟蹤方法,如圖3所示,包括:
步驟1:CPU端加載場(chǎng)景模型Dragon,如圖4所示,解析得到三角片元信息(566098 個(gè)頂點(diǎn),1132830個(gè)三角形)、材質(zhì)信息(0.250000,0.250000,0.250000,1.000000,0.400000,
0.400000,0.400000,1.000000,0.774597,0.774597,0.774597,1.000000,76.800003)、光源信息后打包發(fā)送給GPU端;
步驟2:GPU端得到三角片元信息、材質(zhì)信息、光源信息,分別存儲(chǔ)到對(duì)應(yīng)的全局存儲(chǔ)器和常量存儲(chǔ)器;
步驟3:GPU端建立以整個(gè)3D場(chǎng)景的場(chǎng)景模型為根節(jié)點(diǎn)的Kd-Tree;
步驟4:GPU端進(jìn)行光線跟蹤操作;
步驟5:CPU端進(jìn)行后期圖像處理:CPU端讀取圖像緩存區(qū)的像素信息,顯示到屏幕,完成渲染。
上述步驟1,包括:
步驟1.1:CPU端開辟內(nèi)存或顯存空間,將場(chǎng)景模型加載到內(nèi)存或顯存空間中;
步驟1.2:CPU端對(duì)場(chǎng)景模型進(jìn)行解析,得到三角片元信息、材質(zhì)信息、光源信息;
步驟1.3:將解析好的三角片元信息、材質(zhì)信息、光源信息分別打包發(fā)送到GPU端。
上述步驟3,包括:
步驟3.1:建立3D場(chǎng)景中的各個(gè)場(chǎng)景模型的包圍盒及整個(gè)3D場(chǎng)景模型的包圍盒;
步驟3.2:以整個(gè)3D場(chǎng)景模型的包圍盒為根節(jié)點(diǎn),自上而下進(jìn)行分割,建立以Kd-Tree;
步驟3.2.1:分別將整個(gè)3D場(chǎng)景模型的包圍盒沿著不同軸向(X、Y、Z軸方向)分割成兩個(gè)子空間即得到左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn),分別劃入左子樹、右子樹;
步驟3.2.2:計(jì)算不同軸向的分割成本C(V)≈Kt+Ki(PL Nl+ PR Nr),Nl,Nr為左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn)中的場(chǎng)景模型包圍盒數(shù)量,Kt、Ki為常數(shù),PL、PR為光線進(jìn)入左子樹、右子樹的概率,PL=SA(VL)/SA(V),SA(VL)表示左孩子節(jié)點(diǎn)中的場(chǎng)景模型包圍盒的表面積和,SA(V) 表示3D場(chǎng)景中的所有場(chǎng)景模型包圍盒的表面積和,PR=SA(VR)/SA(V),SA(VR)表示右孩子節(jié)點(diǎn)中的場(chǎng)景模型包圍盒的表面積和;
步驟3.2.3:選擇最小的分割成本對(duì)應(yīng)的軸向分割平面,將整個(gè)3D場(chǎng)景模型的包圍盒分割為左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn);
步驟3.2.4:對(duì)步驟3.2.3中分割得到的左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn)均執(zhí)行步驟3.2.1~3.2.3,分割結(jié)果如圖5(a)所示,創(chuàng)建好的整個(gè)Kd-Tree的邏輯結(jié)構(gòu)如圖5(b)所示;
步驟3.2.5:判斷是否到達(dá)最大分割深度或左孩子節(jié)點(diǎn)、右孩子節(jié)點(diǎn)內(nèi)部三角片元數(shù)均小于指定閾值,是則停止繼續(xù)分割,當(dāng)前的分割結(jié)果即建立的Kd-Tree;否則執(zhí)行步驟3.2.1。最終整個(gè)3D場(chǎng)景中的Kd-Tree劃分結(jié)果如圖5(c)所示。
上述步驟4,包括:
步驟4.1:初始化光線簇:根據(jù)3D場(chǎng)景中的相機(jī)位置生成光線,作為光線簇,存儲(chǔ)在光線簇緩存區(qū);
步驟4.2:判定當(dāng)前光線是否與Kd-Tree的包圍盒相交:如果相交,則進(jìn)行包圍盒內(nèi)部的場(chǎng)景模型與當(dāng)前光線的相交測(cè)試,執(zhí)行步驟4.3;否則當(dāng)前光線不與Kd-Tree的包圍盒內(nèi)部的場(chǎng)景模型相交,將該場(chǎng)景模型作為背景信息填充到圖像緩存區(qū);
步驟4.3:如果當(dāng)前光線與包圍盒內(nèi)部的場(chǎng)景模型相交,則根據(jù)光源位置判斷交點(diǎn)的可見性:如果光源被遮擋,則交點(diǎn)不可見,如果光源未被遮擋,則記錄該交點(diǎn)處為光照處,并將該交點(diǎn)填充到圖像緩存區(qū);如果當(dāng)前光線與包圍盒內(nèi)部的場(chǎng)景模型不相交,則將該場(chǎng)景模型作為背景信息填充到圖像緩存區(qū);
步驟4.4:根據(jù)交點(diǎn)處場(chǎng)景模型的光線信息計(jì)算反射光線,并將反射光線設(shè)為當(dāng)前光線,繼續(xù)追蹤;
步驟4.5:當(dāng)前光線簇緩存區(qū)非空且未到達(dá)最大遍歷深度,返回步驟4.2,對(duì)光線簇緩存區(qū)中的下一條光線進(jìn)行追蹤;否則停止追蹤;
步驟5:CPU端進(jìn)行后期圖像處理:CPU端讀取圖像緩存區(qū)的像素信息,顯示到屏幕,完成渲染。