一種基于OpenCL的并行化漸進(jìn)式光子映射方法和裝置制造方法
【專利摘要】本發(fā)明公開了一種基于OpenCL的并行化漸進(jìn)式光子映射方法和裝置,應(yīng)用于虛擬現(xiàn)實(shí)技術(shù)中的全局光照領(lǐng)域,利用OpenCL實(shí)現(xiàn)并行化漸進(jìn)式光子映射。首先初始化并加載場(chǎng)景模型,初始化OpenCL計(jì)算參數(shù),然后基于OpenCL對(duì)視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染進(jìn)行并行化,把工作負(fù)載合理設(shè)計(jì)在對(duì)應(yīng)的處理器上,等待命令隊(duì)列執(zhí)行完畢,讀取計(jì)算結(jié)果并傳遞給CPU,最后利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)釋放CPU中存儲(chǔ)的數(shù)據(jù)資源。應(yīng)用本發(fā)明所述的方法和裝置,能夠顯著提高漸進(jìn)式光子映射算法的效率,與設(shè)計(jì)在CPU上的計(jì)算方法相比,效率提升到4-9倍,具有高度的可移植性,同時(shí)渲染效果也得到一定的提升。
【專利說(shuō)明】一種基于OpenCL的并行化漸進(jìn)式光子映射方法和裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種基于OpenCL的并行化漸進(jìn)式光子映射方法和裝置,提高了漸進(jìn) 式光子映射算法的效率,對(duì)于真實(shí)感全局光照具有很高的應(yīng)用價(jià)值,屬于虛擬現(xiàn)實(shí)技術(shù)領(lǐng) 域。
【背景技術(shù)】
[0002] 隨著計(jì)算機(jī)圖形學(xué)廣泛應(yīng)用在數(shù)字娛樂,虛擬導(dǎo)航,教育學(xué)習(xí),模擬訓(xùn)練,虛擬醫(yī) 療,電子商務(wù)等等領(lǐng)域中,人們對(duì)圖形渲染的真實(shí)感要求越來(lái)越高,而真實(shí)感全局光照是提 高虛擬場(chǎng)景真實(shí)感的關(guān)鍵技術(shù)之一。目前基于物理的全局光照有光線跟蹤,輻射度和光子 映射,其中光子映射算法利用前兩個(gè)方法的優(yōu)點(diǎn),能夠模擬出各種光照效果。例如,焦散,光 輝及顏色溢出等等。
[0003] 由于光子映射算法計(jì)算量大且保存光子貼圖需要很高的內(nèi)存成本,在交互式系統(tǒng) 中難以達(dá)到實(shí)時(shí)性要求。近幾年來(lái)針對(duì)光子映射提出了很多優(yōu)化方法來(lái)提高算法效率。其 中漸進(jìn)式光子映射算法具有很好的魯棒性,并且基于一致性條件重新規(guī)劃了光子映射算 法,很好地解決了光子貼圖的內(nèi)存成本問(wèn)題。雖然漸進(jìn)式光子映射算法在一定程度上提高 了場(chǎng)景渲染效果,但是算法效率始終是個(gè)瓶頸。在漸進(jìn)式光子映射算法中主要包括三個(gè)步 驟,即視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染。加快視點(diǎn)光線跟蹤、光子跟蹤以及場(chǎng)景渲染速 度是提高算法效率的關(guān)鍵問(wèn)題。
[0004] 隨著計(jì)算機(jī)圖形硬件的快速發(fā)展,利用GPU并行通用計(jì)算來(lái)提高全局光照算法渲 染效率的方法得到了越來(lái)越多的關(guān)注。一些主流的商業(yè)渲染軟件開始利用GPU通用計(jì)算實(shí) 現(xiàn)全局光照。漸進(jìn)式光子映射算法中,視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染具有高度并行 性,基于OpenCL異構(gòu)計(jì)算平臺(tái)實(shí)現(xiàn)并行化漸進(jìn)式光子映射,對(duì)于提高算法效率具有重要意 義。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明的目的在于提供一種基于OpenCL的并行化漸進(jìn)式光子映射方法,將工作 負(fù)載的不同部分分配到適合的處理器,使得算法運(yùn)行效率得到了大幅度的提高。
[0006] 本發(fā)明的另一個(gè)目的在于提供一種基于OpenCL的并行化漸進(jìn)式光子映射裝置, 將工作負(fù)載的不同部分分配到合適的處理器,能使算法運(yùn)行效率得到了大幅度的提高。
[0007] 為了達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
[0008] -種基于OpenCL的并行化漸進(jìn)式光子映射方法,具體包括一下幾個(gè)步驟:
[0009] 步驟1 :初始化OpenCL計(jì)算參數(shù),包括:工作組的維數(shù)和大小信息,創(chuàng)建設(shè)備上下 文及指令隊(duì)列,創(chuàng)建場(chǎng)景模型內(nèi)存對(duì)象、視線交點(diǎn)內(nèi)存對(duì)象、光子貼圖內(nèi)存對(duì)象以及像素矩 陣內(nèi)存對(duì)象,加載視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染文件,聲明視點(diǎn)光線跟蹤內(nèi)核函數(shù)、 光子跟蹤內(nèi)核函數(shù)以及場(chǎng)景渲染內(nèi)核函數(shù);
[0010] 步驟2 :基于OpenCL對(duì)視點(diǎn)光線跟蹤進(jìn)行并行化;
[0011] 步驟3 :基于OpenCL對(duì)光子跟蹤進(jìn)行并行化;
[0012] 步驟4 :基于OpenCL對(duì)場(chǎng)景渲染并行化;
[0013] 步驟5 :釋放GPU中存儲(chǔ)的數(shù)據(jù)資源。
[0014] 一種基于OpenCL的并行化漸進(jìn)式光子映射裝置,該裝置包括:
[0015] 配置單元,用于初始化OpenCL計(jì)算參數(shù),包括:工作組的維數(shù)和大小信息,創(chuàng)建設(shè) 備上下文及指令隊(duì)列,創(chuàng)建場(chǎng)景模型內(nèi)存對(duì)象、視線交點(diǎn)內(nèi)存對(duì)象、光子貼圖內(nèi)存對(duì)象以及 像素矩陣內(nèi)存對(duì)象,加載視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染文件,聲明視點(diǎn)光線跟蹤內(nèi)核 函數(shù)、光子跟蹤內(nèi)核函數(shù)以及場(chǎng)景渲染內(nèi)核函數(shù);
[0016] 并行化單元,用于在GPU上利用OpenCL對(duì)視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染進(jìn) 行并行計(jì)算,并把最終計(jì)算結(jié)果傳給CPU ;
[0017] 釋放單元,用于利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clReleaseMemObject ()來(lái)釋放GPU中存 儲(chǔ)的數(shù)據(jù)資源。
[0018] 上述的技術(shù)方案可以看出,本發(fā)明的益處在于:
[0019] 基于OpenCL異構(gòu)并行計(jì)算平臺(tái)設(shè)計(jì)一種并行化漸進(jìn)式光子映射方法,在不同圖 形處理器之間可移植性強(qiáng);將工作負(fù)載的不同部分設(shè)計(jì)在適合的處理器上,CPU主要負(fù)責(zé) 管理和調(diào)度各個(gè)任務(wù),GPU負(fù)責(zé)通用并行計(jì)算,能夠大幅度地提升算法執(zhí)行效率。
【專利附圖】
【附圖說(shuō)明】
[0020] 圖1為本發(fā)明基于OpenCL的并行化漸進(jìn)式光子映射方法實(shí)施例的流程圖;
[0021] 圖2為本發(fā)明方法實(shí)施例中的計(jì)算視點(diǎn)光線與場(chǎng)景物交點(diǎn)示意圖;
[0022] 圖3為本發(fā)明方法實(shí)施例中的視點(diǎn)光線跟蹤中每個(gè)工作項(xiàng)的并行任務(wù)示意圖;
[0023] 圖4為本發(fā)明基于OpenCL的并行化漸進(jìn)式光子映射裝置實(shí)施例的組成結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0024] 針對(duì)現(xiàn)有技術(shù)中存在的問(wèn)題,本發(fā)明中結(jié)合OpenCL異構(gòu)并行計(jì)算平臺(tái)提出一種 并行化漸進(jìn)式光子映射方案,以實(shí)現(xiàn)提高算法的執(zhí)行效率。
[0025] 下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完 整地描述。本發(fā)明是一種基于OpenCL的并行化漸進(jìn)式光子映射方法和裝置,結(jié)合OpenCL 異構(gòu)并行計(jì)算架構(gòu),把漸進(jìn)式光子映射中各個(gè)步驟進(jìn)行并行化,通過(guò)不同的工作負(fù)載設(shè)計(jì) 在適合的處理器上,CPU主要負(fù)責(zé)管理和調(diào)度各個(gè)任務(wù),GPU負(fù)責(zé)通用并行計(jì)算,算法的執(zhí) 行效率得到大幅度的提高。
[0026] 圖1為本發(fā)明基于OpenCL的并行化漸進(jìn)式光子映射方法實(shí)施例的流程圖。如圖 1所示,視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染設(shè)計(jì)在GPU上,從而充分利用了 GPU的計(jì)算性 能,提高渲染效率。CPU負(fù)責(zé)其中各過(guò)程的調(diào)度、初始化場(chǎng)景以及加載場(chǎng)景模型。具體包括 一下步驟:
[0027] 步驟101 :根據(jù)屏幕分辨率定義一個(gè)像素矩陣,并初始化像素矩陣中的每一個(gè)值 為0,設(shè)定虛擬相機(jī)以及光源位置。
[0028] 步驟102 :讀取場(chǎng)景模型,把模型的幾何面片保存在一個(gè)內(nèi)存區(qū)域中,并用KD-樹 來(lái)組織和管理場(chǎng)景里的幾何面片,用于下一步幾何求交運(yùn)算。
[0029] 如何讀取模型和建立KD-樹為現(xiàn)有技術(shù),不再贅述。
[0030] 步驟103 :初始化OpenCL計(jì)算參數(shù),設(shè)置一個(gè)工作組大小為16 X 16,要 確保全局工作節(jié)點(diǎn)各個(gè)維數(shù)能被工作組對(duì)應(yīng)維數(shù)整除,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù) clCreateContextFromType ()創(chuàng)建設(shè)備上下文,并用 clCreateCommandQueue ()創(chuàng)建命 令隊(duì)列,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clCreateBuffer ()創(chuàng)建場(chǎng)景模型緩沖區(qū)、視線交點(diǎn) 緩沖區(qū)、光子貼圖緩沖區(qū)以及像素緩沖區(qū),其中場(chǎng)景模型緩沖區(qū)為內(nèi)核只讀模式,視線 交點(diǎn)緩沖區(qū)、光子貼圖緩沖區(qū)以及像素緩沖區(qū)為內(nèi)核讀寫模式,利用OpenCL標(biāo)準(zhǔn)庫(kù)函 數(shù)clCreateProgramWithSourceO加載視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染文件,并用 clBuildProgramO轉(zhuǎn)化為內(nèi)核可執(zhí)行的程序文件,倉(cāng)ij建聲明基于OpenCL的視點(diǎn)光線跟蹤 內(nèi)核函數(shù)、光子跟蹤內(nèi)核函數(shù)和場(chǎng)景渲染內(nèi)核函數(shù)。
[0031] 步驟104 :視點(diǎn)光線跟蹤并行化或視線跟蹤并行化中,首先利用OpenCL標(biāo)準(zhǔn)庫(kù)函 數(shù)clSetKernelArgO將參數(shù)地址傳入視點(diǎn)光線跟蹤內(nèi)核函數(shù),參數(shù)包括場(chǎng)景模型數(shù)據(jù)、像 素矩陣和視線交點(diǎn)數(shù)據(jù),利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueWriteBuffer (),將指令序列數(shù) 據(jù)緩沖區(qū)中視點(diǎn)光線跟蹤所需要的場(chǎng)景模型數(shù)據(jù)和像素矩陣傳遞到GPU中,利用OpenCL標(biāo) 準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernelO激活視點(diǎn)光線跟蹤內(nèi)核并其執(zhí)行,具體為:
[0032] 每一個(gè)視點(diǎn)光線對(duì)應(yīng)一個(gè)OpenCL工作項(xiàng),如圖2所示,在每一個(gè)工作項(xiàng)中完成發(fā) 射視點(diǎn)光線、計(jì)算視點(diǎn)光線與場(chǎng)景幾何面片的交點(diǎn)、保存交點(diǎn)以及更新交點(diǎn)信息。如圖3所 示,從視點(diǎn)通過(guò)成像平面上的柵格點(diǎn)向場(chǎng)景發(fā)射光線,計(jì)算與場(chǎng)景幾何面片的交點(diǎn)。其中交 點(diǎn)信息包括交點(diǎn)位置,光線入射方向,像素權(quán)值及像素位置等。根據(jù)不同的像素?cái)?shù)量一般情 況下向場(chǎng)景發(fā)射幾十萬(wàn)至幾百萬(wàn)光線;
[0033] 最后利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行完成, 并通過(guò)調(diào)用clEnqueueReadBufferO將OpenCL計(jì)算得到的視線交點(diǎn)數(shù)據(jù)傳遞到CPU內(nèi)存。 [0034] 如何計(jì)算視點(diǎn)光線與場(chǎng)景幾何面片的交點(diǎn)為現(xiàn)有技術(shù),不再贅述。
[0035] 步驟105 :光子跟蹤并行化中,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO將參數(shù) 地址傳入光子跟蹤內(nèi)核函數(shù),參數(shù)包括場(chǎng)景模型數(shù)據(jù)和光子貼圖,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù) clEnqueueWriteBuffer (),將指令序列數(shù)據(jù)緩沖區(qū)中視點(diǎn)光線跟蹤所需要的場(chǎng)景模型數(shù)據(jù) 傳遞到GPU中,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernelO激活光子跟蹤內(nèi)核并 其執(zhí)行,具體為:
[0036] 各個(gè)光子跟蹤是相互獨(dú)立,把每個(gè)光子的創(chuàng)建、發(fā)射和跟蹤設(shè)計(jì)在一個(gè)OpenCL的 工作項(xiàng)中。首先創(chuàng)建一個(gè)光子,光子信息主要包括光源位置、光能量和面片索引。從光源發(fā) 射光子并進(jìn)行跟蹤,對(duì)于光子跟蹤設(shè)置了最大跟蹤深度,這樣不會(huì)進(jìn)行無(wú)限跟蹤光子。每次 跟蹤光子時(shí),首先判斷光子跟蹤深度是否達(dá)到最大值,如果達(dá)到最大值就停止繼續(xù)跟蹤,并 光子保存到光子貼圖中;
[0037] 最后利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行完成, 并通過(guò)調(diào)用clEnqueueReadBufferO將OpenCL計(jì)算得到的光子貼圖傳遞到CPU內(nèi)存。
[0038] 步驟106 :場(chǎng)景渲染并行化中,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueWriteBuffer (), 將指令序列數(shù)據(jù)緩沖區(qū)中場(chǎng)景渲染所需要的視線交點(diǎn)數(shù)據(jù)和光子貼圖傳遞到GPU中,利用 OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernelO激活場(chǎng)景渲染內(nèi)核并其執(zhí)行,具體為:
[0039] 通過(guò)計(jì)算視點(diǎn)光線與場(chǎng)景幾何面片交點(diǎn)處的輻射度來(lái)確定對(duì)應(yīng)像素的顏色值。每 個(gè)交點(diǎn)是相互獨(dú)立的,可以并行計(jì)算。式(1)為求解輻射度。其中Nemitted為發(fā)射光子數(shù)量, g為視點(diǎn)光線在交點(diǎn)處的入射方向,為光子入射方向,f;為BRDF函數(shù),⑴為光子 P在χρ處方向上的光通量;
[0040]
【權(quán)利要求】
1. 一種基于OpenCL的并行化漸進(jìn)式光子映射方法,其特征在于,包括以下幾個(gè)步驟: 步驟1 :初始化OpenCL計(jì)算參數(shù),包括:工作組的維數(shù)和大小信息,創(chuàng)建設(shè)備上下文及 指令隊(duì)列,創(chuàng)建場(chǎng)景模型內(nèi)存對(duì)象、視線交點(diǎn)內(nèi)存對(duì)象、光子貼圖內(nèi)存對(duì)象以及像素矩陣內(nèi) 存對(duì)象,加載視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染文件,聲明視點(diǎn)光線跟蹤內(nèi)核函數(shù)、光子 跟蹤內(nèi)核函數(shù)以及場(chǎng)景渲染內(nèi)核函數(shù); 步驟2 :基于OpenCL對(duì)視點(diǎn)光線跟蹤進(jìn)打并彳丁化; 步驟3 :基于OpenCL對(duì)光子跟蹤進(jìn)行并行化; 步驟4 :基于OpenCL對(duì)場(chǎng)景渲染并行化; 步驟5 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clReleaseMemObject ()來(lái)釋放GPU中存儲(chǔ)的數(shù)據(jù)資 源。
2. 根據(jù)權(quán)利要求1所述的基于OpenCL的并行化漸進(jìn)式光子映射方法,其特征在于,步 驟1具體包括: 步驟1-1 :設(shè)置一個(gè)工作組大小為16X16,要確保全局工作節(jié)點(diǎn)各個(gè)維數(shù)能被工作組 對(duì)應(yīng)維數(shù)整除; 步驟1-2 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clCreateContextFromTypeO創(chuàng)建設(shè)備上下文,并 用 clCreateCo_andQueue()創(chuàng)建命令隊(duì)列; 步驟1-3 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clCreateBufferO創(chuàng)建場(chǎng)景模型緩沖區(qū)、視線交點(diǎn) 緩沖區(qū)、光子貼圖緩沖區(qū)以及像素緩沖區(qū),其中場(chǎng)景模型緩沖區(qū)為內(nèi)核只讀模式,視線交點(diǎn) 緩沖區(qū)、光子貼圖緩沖區(qū)以及像素緩沖區(qū)為內(nèi)核讀寫模式; 步驟1-4 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clCreateProgramWithSourceO加載視點(diǎn)光線跟 蹤、光子跟蹤和場(chǎng)景渲染文件,并用clBuildProgramO轉(zhuǎn)化為內(nèi)核可執(zhí)行的程序文件; 步驟1-5 :創(chuàng)建聲明基于OpenCL的視點(diǎn)光線跟蹤內(nèi)核函數(shù); 步驟1-6 :創(chuàng)建聲明基于OpenCL的光子跟蹤內(nèi)核函數(shù); 步驟1-7 :創(chuàng)建聲明基于OpenCL的場(chǎng)景渲染內(nèi)核函數(shù)。
3. 根據(jù)權(quán)利要求1所述的基于OpenCL的并行化漸進(jìn)式光子映射方法,其特征在于,步 驟2具體包括: 步驟2-1 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO將參數(shù)地址傳入視點(diǎn)光線跟蹤 內(nèi)核函數(shù),參數(shù)包括場(chǎng)景模型數(shù)據(jù)、像素矩陣和視線交點(diǎn)數(shù)據(jù); 步驟2-2 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueWriteBuffer (),將指令序列數(shù)據(jù)緩沖區(qū) 中視點(diǎn)光線跟蹤所需要的場(chǎng)景模型數(shù)據(jù)和像素矩陣傳遞到GPU中; 步驟2-3 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernel ()激活視點(diǎn)光線跟蹤內(nèi) 核并其執(zhí)行: 步驟2-3-1 :從視點(diǎn)經(jīng)過(guò)像素點(diǎn)向場(chǎng)景發(fā)射光線; 步驟2-3-2 :計(jì)算光線與場(chǎng)景幾何面片的交點(diǎn); 步驟2-3-3:保存視線交點(diǎn)信息,包括交點(diǎn)位置,光線入射方向,像素權(quán)值及像素位置 等; 步驟2-3-4 :更新視線交點(diǎn)信息; 步驟2-4 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行完成, 并通過(guò)調(diào)用clEnqueueReadBufferO將OpenCL計(jì)算得到的視線交點(diǎn)數(shù)據(jù)傳遞到CPU內(nèi)存。
4. 根據(jù)權(quán)利要求1所述的基于OpenCL的并行化漸進(jìn)式光子映射方法,其特征在于,步 驟3具體包括: 步驟3-1 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO將參數(shù)地址傳入光子跟蹤內(nèi)核 函數(shù),參數(shù)包括場(chǎng)景模型數(shù)據(jù)和光子貼圖; 步驟3-2 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueWriteBuffer (),將指令序列數(shù)據(jù)緩沖區(qū) 中光子跟蹤所需要的場(chǎng)景模型數(shù)據(jù)傳遞到GPU中; 步驟3-3 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernel ()激活光子跟蹤內(nèi)核并 其執(zhí)行: 步驟3-3-1 :創(chuàng)建一個(gè)光子,包含如下信息:光子位置,光能量和面片索引; 步驟3-3-2:從光源發(fā)射光子; 步驟3-3-3 :跟蹤光子路徑; 步驟3-3-4 :如果光子與鏡表面相交,轉(zhuǎn)為步驟3 ; 步驟3-3-5 :如果光子遇到漫射表面,保存光子; 步驟3-3-6 :建立光子KD-Tree,并保存光子信息; 步驟3-4 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行完成, 并通過(guò)調(diào)用clEnqueueReadBufferO將OpenCL計(jì)算得到的光子貼圖傳遞到CPU內(nèi)存。
5. 根據(jù)權(quán)利要求1所述的基于OpenCL的并行化漸進(jìn)式光子映射方法,其特征在于,步 驟4具體包括: 步驟4-1 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO將參數(shù)傳入場(chǎng)景渲染內(nèi)核函數(shù), 參數(shù)包括視線交點(diǎn)數(shù)據(jù)、像素矩陣和光子貼圖; 步驟4-2 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueWriteBuffer (),將指令序列數(shù)據(jù)緩沖區(qū) 中場(chǎng)景渲染所需要的視線交點(diǎn)數(shù)據(jù)和光子貼圖傳遞到GPU中; 步驟4-3 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernel ()激活場(chǎng)景渲染內(nèi)核并 其執(zhí)行: 步驟4-3-1 :以視線交點(diǎn)為圓心,查找指定半徑內(nèi)的光子數(shù)量; 步驟4-3-2 :通過(guò)式(1)計(jì)算視線交點(diǎn)處的輻射度:
其中為發(fā)射光子數(shù)量,β>為視點(diǎn)光線在交點(diǎn)處的入射方向,為光子入射方向, f;為BRDF函數(shù),為光子ρ在χρ處心方向上的光通量; (1) ⑵ 步驟4-3-3 :通過(guò)視線交點(diǎn)處的輻射度確定交點(diǎn)對(duì)應(yīng)像素的顏色值; 步驟4-4 :利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行完成, 并通過(guò)調(diào)用clEnqueueReadBufferO將OpenCL計(jì)算得到的像素矩陣顏色值傳遞到CPU內(nèi) 存。
6. -種基于OpenCL的并行化漸進(jìn)式光子映射裝置,其特征在于,該裝置包括:配置單 元、并行化單元和釋放單元,其中, 所述配置單元,用于初始化OpenCL計(jì)算參數(shù),包括:工作組的維數(shù)和大小信息,創(chuàng)建設(shè) 備上下文及指令隊(duì)列,創(chuàng)建場(chǎng)景模型內(nèi)存對(duì)象、視線交點(diǎn)內(nèi)存對(duì)象、光子貼圖內(nèi)存對(duì)象以及 像素矩陣內(nèi)存對(duì)象,加載視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染文件,聲明視點(diǎn)光線跟蹤內(nèi)核 函數(shù)、光子跟蹤內(nèi)核函數(shù)以及場(chǎng)景渲染內(nèi)核函數(shù); 所述并行化單元,用于在GPU上利用OpenCL對(duì)視點(diǎn)光線跟蹤、光子跟蹤和場(chǎng)景渲染進(jìn) 行并行計(jì)算,并把最終計(jì)算結(jié)果傳給CPU ; 所述釋放單元,用于利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clReleaseMemObject()來(lái)釋放GPU中存 儲(chǔ)的數(shù)據(jù)資源。
7. 根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述配置單元包括:設(shè)置工作組單元、創(chuàng) 建平臺(tái)單元和加載內(nèi)核單元,其中, 所述設(shè)置工作組單元,用于設(shè)置一個(gè)工作組大小為16X16,要確保全局工作節(jié)點(diǎn)各個(gè) 維數(shù)能被工作組對(duì)應(yīng)維數(shù)整除; 所述創(chuàng)建平臺(tái)單元,用于利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clCreateContextFromType ()創(chuàng)建設(shè) 備上下文,并用clCreateCommandQueueO創(chuàng)建命令隊(duì)列; 所述加載內(nèi)核單元,用于利用OpenCL庫(kù)函數(shù)clCreateProgramWithSourceO加載視點(diǎn) 光線跟蹤、光子跟蹤和場(chǎng)景渲染文件,并用clBuildProgramO轉(zhuǎn)化為內(nèi)核可執(zhí)行的程序文 件。
8. 根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述并行化單元包括:并行化視點(diǎn)光線跟 蹤單元、并行化光子跟蹤單元和并行化場(chǎng)景渲染單元,其中, 所述并行化視點(diǎn)光線跟蹤單元,用于通過(guò)OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO 將參數(shù)地址傳入視點(diǎn)光線跟蹤內(nèi)核函數(shù),參數(shù)包括場(chǎng)景模型數(shù)據(jù)、像素矩陣和視線交 點(diǎn)數(shù)據(jù),利用OpenCL庫(kù)函數(shù)clEnqueueWriteBufferO,將指令序列數(shù)據(jù)緩沖區(qū)中視點(diǎn) 光線跟蹤所需要的場(chǎng)景模型數(shù)據(jù)和像素矩陣傳遞到GPU中,通過(guò)OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù) clEnqueueNDRangeKernel ()激活視點(diǎn)光線跟蹤內(nèi)核并其執(zhí)行,視點(diǎn)光線內(nèi)核中從視點(diǎn)通過(guò) 成像平面上的柵格點(diǎn)向場(chǎng)景發(fā)射光線,計(jì)算與場(chǎng)景幾何面片的交點(diǎn),保存并更新交點(diǎn)信息, 最后利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行完成,并通過(guò)調(diào) 用clEnqueueReadBufferO將OpenCL計(jì)算得到的視線交點(diǎn)數(shù)據(jù)傳遞到CPU內(nèi)存; 所述并行化光子跟蹤單元,用于通過(guò)OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO將參數(shù) 地址傳入光子跟蹤內(nèi)核函數(shù),參數(shù)包括場(chǎng)景模型數(shù)據(jù)和光子貼圖,利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù) clEnqueueWriteBufferO,將指令序列數(shù)據(jù)緩沖區(qū)中視點(diǎn)光線跟蹤所需要的場(chǎng)景模型數(shù)據(jù) 傳遞到GPU中,通過(guò)OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueNDRangeKernel ()激活光子跟蹤內(nèi)核并 其執(zhí)行,光子跟蹤內(nèi)核中創(chuàng)建光子,從光源向場(chǎng)景發(fā)射光子并進(jìn)行跟蹤,被吸收的光子保存 在光子貼圖中,最后利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所有命令執(zhí)行 完成,并通過(guò)調(diào)用clEnqueueReadBufferO將OpenCL計(jì)算得到的光子貼圖傳遞到CPU內(nèi) 存; 所述并行化場(chǎng)景渲染單元,用于通過(guò)OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clSetKernelArgO將參 數(shù)地址傳入場(chǎng)景渲染內(nèi)核函數(shù),參數(shù)包括場(chǎng)景像素矩陣、視線交點(diǎn)數(shù)據(jù)和光子貼圖,利 用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clEnqueueWriteBufferO,將指令序列數(shù)據(jù)緩沖區(qū)中視點(diǎn)光線跟 蹤所需要的像素矩陣、視線交點(diǎn)數(shù)據(jù)和光子貼圖傳遞到GPU中,通過(guò)OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù) clEnqueueNDRangeKernel ()激活場(chǎng)景渲染內(nèi)核并其執(zhí)行,場(chǎng)景渲染內(nèi)核中對(duì)視點(diǎn)光線跟蹤 中計(jì)算得到的交點(diǎn)進(jìn)行查找,得到每個(gè)像素所對(duì)應(yīng)的交點(diǎn),以交點(diǎn)為圓心計(jì)算指定半徑內(nèi) 的光子數(shù)量,通過(guò)光子數(shù)量來(lái)計(jì)算交點(diǎn)處的輻射度,式(1)為求解輻射度。通過(guò)輻射度來(lái)確 定交點(diǎn)對(duì)應(yīng)像素的顏色值,最后利用OpenCL標(biāo)準(zhǔn)庫(kù)函數(shù)clFinishO等待命令隊(duì)列中的所 有命令執(zhí)行完成,并通過(guò)調(diào)用clEnqueueReadBuffer ()將OpenCL計(jì)算得到的像素矩陣顏色 值傳遞到CPU內(nèi)存,
(1) ⑶ 其中,為發(fā)射光子數(shù)量,G為視點(diǎn)光線在交點(diǎn)處的入射方向,叫為光子入射方 向,fr為BRDF函數(shù),么為光子p在xp處:^,方向上的光通量。
【文檔編號(hào)】G06F9/38GK104090742SQ201410341679
【公開日】2014年10月8日 申請(qǐng)日期:2014年7月17日 優(yōu)先權(quán)日:2014年7月17日
【發(fā)明者】賈慶軒, 扎西次仁, 李旭龍, 孫漢旭, 宋荊洲 申請(qǐng)人:北京郵電大學(xué)