• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于基元重啟的OpenGL和CUDA圖形渲染算法探索

      2016-04-11 10:51:29劉敏娜李延香魏浩

      劉敏娜 李延香 魏浩

      摘要:針對(duì)OpenGL渲染圖形要多次訪問(wèn)緩存區(qū)的問(wèn)題,提出一種OpenGL和CUDA混合編程的圖形渲染算法來(lái)加速PerlinKernel生成虛擬地形圖。首先,通過(guò)OpenGL將緩存映射到CUDA內(nèi)存空間,利用CUDA完成加速計(jì)算任務(wù);然后,為幾何圖形設(shè)置開(kāi)始和結(jié)束的位置標(biāo)志,使用基元重啟對(duì)圖形進(jìn)行組合;最后,對(duì)緩沖區(qū)對(duì)象進(jìn)行渲染。實(shí)驗(yàn)結(jié)果表明,改進(jìn)后的基于基元重啟的混合算法在GTX650GPU上的平均幀速率為960fps,幀速率提高6%,算法改進(jìn)后渲染方法的執(zhí)行效率提高了63倍。實(shí)驗(yàn)證實(shí)基元重啟可以提高3D處理性能。

      關(guān)鍵詞:圖形渲染;OpenGL;CUDA;基元重啟;Perlin

      中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A

      1引言

      圖形渲染在核試驗(yàn)、DNA分子分布、天氣預(yù)報(bào)等大規(guī)??茖W(xué)計(jì)算任務(wù)中扮演著重要的角色[1,2]。在OpenGL中圖形渲染是由CPU進(jìn)行單獨(dú)完成的,CPU從RAM中獲得數(shù)據(jù)并且處理數(shù)據(jù),然后寫入RAM中[3]。這樣做性能并不高,原因如下:①CPU的負(fù)載重而導(dǎo)致響應(yīng)速度慢,影響渲染速度和質(zhì)量;②圖形渲染中使用了multiDraw()方法,繪圖開(kāi)銷過(guò)大。multiDraw()用一條命令代替了多條glDraw*()方法,但是使用這個(gè)方法,導(dǎo)致頂點(diǎn)數(shù)組擴(kuò)大了1/2,大量的冗余數(shù)據(jù)傳輸?shù)紺PU中,造成極大的開(kāi)銷[4-7]。

      本文提出了一種CUDA和OpenGL混合圖形渲染的方法。CUDA(ComputeUnifiedDeviceArchitecture),是NVIDIA顯卡廠商推出的通用并行計(jì)算架構(gòu),該架構(gòu)使GPU能夠解決復(fù)雜的計(jì)算問(wèn)題[8-10]。在本文中,為了進(jìn)一步提高數(shù)據(jù)傳輸效率,圖形渲染中引入了基元重啟,使用基元重啟可以對(duì)幾何圖形進(jìn)行組合,組合之后,需要處理的集合圖形數(shù)據(jù)更少,系統(tǒng)運(yùn)行速度更快。

      2.1傳統(tǒng)的OpenGL圖形渲染

      OpenGL中的頂點(diǎn),顏色,法線和其它頂點(diǎn)屬性數(shù)據(jù)都是由GLTools庫(kù)管理的。每次調(diào)用glDrawArrays、glDrawElements等一些需要頂點(diǎn)數(shù)據(jù)的函數(shù)時(shí),信息是從一個(gè)帶有本地GPU的高性能系統(tǒng)中的應(yīng)用程序內(nèi)存中獲取的,數(shù)據(jù)將從應(yīng)用程序的內(nèi)存中通過(guò)PCI-Express接口總線傳遞到GPU本地內(nèi)存[11],將會(huì)耗費(fèi)大量時(shí)間,降低應(yīng)用程序的運(yùn)行速度。

      如果將對(duì)象的所有頂點(diǎn)數(shù)據(jù)打包到單個(gè)緩沖區(qū)中,程序中必定包含循環(huán),會(huì)產(chǎn)生很多OpenGL調(diào)用,每次調(diào)用都會(huì)有一定的系統(tǒng)開(kāi)銷。如果場(chǎng)景中存在大量對(duì)象,每個(gè)對(duì)象都有相關(guān)的三角形,那么對(duì)glDrawArrays的調(diào)用中的開(kāi)銷將會(huì)積累,從而對(duì)應(yīng)用程序性能產(chǎn)生負(fù)面影響。

      為了提高系統(tǒng)的處理效率,可以將大批非連接的三角形組合成三角形帶,如圖1所示。本來(lái)獨(dú)立的三角型需要3個(gè)頂點(diǎn)才能進(jìn)行表示,經(jīng)過(guò)組合之后每個(gè)三角形所需的頂點(diǎn)數(shù)減少到1個(gè)(不包含三角形帶中的第一個(gè)三角形)。這樣需要處理的集合數(shù)據(jù)更少了,系統(tǒng)運(yùn)行速度會(huì)更快。

      但是問(wèn)題是,一個(gè)三角形可以通過(guò)單次調(diào)用glDrawArrays或者glDrawElements進(jìn)行渲染,一組三角形帶的渲染就要單獨(dú)對(duì)OpenGL進(jìn)行多次調(diào)用,這意味著在一個(gè)使用條帶化集合圖形的程序中有更多的函數(shù),這可能會(huì)抵消使用條帶化所獲得的性能提升。所以針對(duì)條帶化處理應(yīng)該有更好的方法來(lái)提高系統(tǒng)的性能,文中提出了基元重啟算法。

      2.2基元重啟

      基元重啟是設(shè)定一個(gè)可以被OpenGL狀態(tài)機(jī)識(shí)別的數(shù)據(jù)值,該數(shù)據(jù)值用于標(biāo)識(shí)當(dāng)前圖形圖元已經(jīng)繪制完成。下一個(gè)數(shù)據(jù)項(xiàng)表示同樣類型的另一個(gè)圖形圖元開(kāi)始。基元重啟應(yīng)用在GL_TRIANGLE_TRIP、GL_TRIANGLE_FAN、GL_LINE_STRIP和GL_LINE_LOOP幾何圖形類型中。方法在一個(gè)條帶(或者扇,環(huán))結(jié)束和另一個(gè)開(kāi)始時(shí)通知OpenGL。在幾何圖形中指示出一個(gè)條帶結(jié)束,下一個(gè)條帶的開(kāi)始位置,實(shí)現(xiàn)時(shí)需要在元素?cái)?shù)組中放置一個(gè)作為保留值的特殊標(biāo)志。由于OpenGL是從元素?cái)?shù)組中獲取頂點(diǎn)索引(或者在內(nèi)部生成它們),在glDrawArrays非索引繪制命令情況下,會(huì)檢查這個(gè)特殊索引值,并且在遇到它時(shí)結(jié)束當(dāng)前條帶并在下一個(gè)頂點(diǎn)開(kāi)始一個(gè)新的條帶。在基元重啟模式開(kāi)啟時(shí),OpenGL會(huì)在遇到它時(shí)停止當(dāng)前的條帶并開(kāi)始一個(gè)新的條帶。

      如圖2所示,三角形帶由9個(gè)頂點(diǎn)組成,在單個(gè)連接的三角形帶中一共產(chǎn)生了8個(gè)三角形。通過(guò)開(kāi)啟基元重啟模式并將基元重啟索引設(shè)置為5,三角形帶會(huì)在頂點(diǎn)4處結(jié)束,如圖3所示。頂點(diǎn)5的實(shí)際位置將被忽略,下一個(gè)進(jìn)行處理的頂點(diǎn)6將稱為新的三角形帶的起始位置。所以,在向OpenGL傳遞9個(gè)頂點(diǎn)的情況下,得到兩個(gè)獨(dú)立的三角形帶,一個(gè)繪制3個(gè)三角形,另一個(gè)繪制2個(gè)三角形。這樣一次數(shù)據(jù)傳輸?shù)臄?shù)據(jù)量就增加了。

      基元重啟的好處:

      1)基元重啟的標(biāo)記值和繪圖的數(shù)據(jù)可同時(shí)生成并存放于GPU上。

      2)不同基元重啟標(biāo)記值可以指定不同數(shù)量的繪圖元素,可通過(guò)給glDrawElements()指定不同的繪圖模式,繪制任意數(shù)量的線段、三角條帶、三角扇面等圖形,所以可以繪制不規(guī)則的網(wǎng)格或表面。

      3)通過(guò)安排索引可以優(yōu)化渲染性能,達(dá)到在紋理單元中最大限度重用數(shù)據(jù)高速緩存。

      2.3基于基元重啟的OpenGL和CUDA圖形渲染的實(shí)現(xiàn)

      采用Perlin噪聲生成器創(chuàng)建虛擬地形的立體地圖[12],通過(guò)按鍵命令改變地形特征。框架分成4個(gè)獨(dú)立的文件,分別如下:

      1)kernelVBO.cpp,CUDA數(shù)據(jù)生成器;

      2)simpleGLmain.cpp,定義OpenGL和GLUT的主體框架;

      3)simpleVBO.cpp,是通用的OpenGL與CUDA設(shè)置以及內(nèi)存管理;

      4)callbackVBO.cpp,用于定義鍵盤,鼠標(biāo),顯示的回調(diào)函數(shù)。

      kernelVBO

      kernelVBO的處理流程如下:

      1)指定Perlin噪聲計(jì)算中使用的頭文件、變量和方法;

      2)colorElevation()方法根據(jù)地形各點(diǎn)的海拔返回像素的顏色,選用不同顏色可以為用戶呈現(xiàn)一種觀看地圖的感覺(jué);

      3)錯(cuò)誤檢查函數(shù);

      4)k_perlin()函數(shù)利用Perlin噪聲生成地形圖,將低于海平面的區(qū)域的高度設(shè)為0。調(diào)用cudaThreadSynchronize(),主機(jī)刷新OpenGL緩沖區(qū)需要等待Kernel執(zhí)行完畢。

      simpleGLmain

      simpleGLmain用來(lái)在屏幕上打開(kāi)一個(gè)窗口,并設(shè)置一些基本的視角變換參數(shù)。調(diào)用gluPerspective(),在三維空間中設(shè)置一個(gè)攝像機(jī),從該攝像機(jī)的位置觀察CUDA生成的數(shù)據(jù)。當(dāng)數(shù)據(jù)或視角位置發(fā)生變化時(shí),OpenGL會(huì)識(shí)別和刷新顯示像素。

      渲染需要進(jìn)行如下3D變換:

      [1]視角變換,場(chǎng)景中攝像機(jī)的安放與定點(diǎn);

      [2]模型變換,安排場(chǎng)景構(gòu)成;

      [3]投影變換,調(diào)整攝像機(jī)的變焦;

      [4]可視區(qū)變換選擇最終的尺寸。

      OpenGL的視角、模型、投影、可視區(qū)變換,以及坐標(biāo)系統(tǒng)的設(shè)定都要慎重。

      simpleGLmain處理流程:

      1)main函數(shù)初始化用于計(jì)算幀速率的定時(shí)器,然后調(diào)用用戶自定義的方法初始化CUDAKernel,然后注冊(cè)用戶的回調(diào)函數(shù),最后調(diào)用GLUT主循環(huán);

      2)計(jì)算幀速率,并將其顯示在窗口的標(biāo)題欄中;

      3)GLUT和OpenGL初始化函數(shù)創(chuàng)建一個(gè)窗口,并在3D空間中指定一個(gè)視角位置。

      simpleVBO

      simpleVBO的算法如下:

      1)定義創(chuàng)建和映射色彩信息PBO和頂點(diǎn)VBO的邏輯。

      2)creatVBO()調(diào)用glBufferData(),在GPU上分配圖形緩存區(qū)。GL_DYNAMIC_DRAW標(biāo)志位告知OpenGL該數(shù)據(jù)存儲(chǔ)會(huì)被重復(fù)修改與使用。cudaGraphicsGLRegisterBuffer()將緩沖對(duì)象注冊(cè)為CUDA可訪問(wèn)數(shù)據(jù)。deleteVBO()方法將OpenGL緩沖對(duì)象解除注冊(cè)并釋放對(duì)應(yīng)的存儲(chǔ)空間。

      3)runCUDA()完成所有色彩PBO的與頂點(diǎn)VBO的映射和檢索指針。地址傳給lauch_kernel()方法,并被用戶自定義的Kernel使用。Lanuch_kernel()在返回之前會(huì)等待所有的Kernel執(zhí)行完畢,因此該方法返回時(shí)可以安全交回OpenGL資源。

      使用基元重啟渲染三角形時(shí),通過(guò)glPrimituveRestartIndexNV()方法告知OpenGL狀態(tài)機(jī)重啟的標(biāo)記值,然后在OpenGL客戶狀態(tài)機(jī)上啟動(dòng)基元重啟功能。調(diào)用glDrawElement()渲染數(shù)據(jù)。當(dāng)渲染結(jié)束,在OpenGL狀態(tài)機(jī)上關(guān)閉基元重啟。

      3實(shí)驗(yàn)結(jié)果及性能分析

      實(shí)驗(yàn)平臺(tái)為Intel2.3GHzCore2雙核處理器,圖形加速器為NVIDIA公司的GTX650,核心頻率為1000MHz,顯存頻率為4500MHz,顯存位寬為128b,顯存為1024MB,操作系統(tǒng)為L(zhǎng)inux,運(yùn)行的是PerlinKernel生成虛擬地形圖的示例。驅(qū)動(dòng)程序的版本號(hào)是9.18.13.2057,總線采用PCIExpress3.0x16接口。應(yīng)用程序在VS2010環(huán)境編譯及執(zhí)行,采用CUDA平臺(tái)GPU設(shè)備編寫kernel程序,程序使用擴(kuò)展的C語(yǔ)言編寫。

      表1中的數(shù)據(jù)代表在最差情況幀速率方案中,程序混合使用CUDA和OpenGL所展示的能力和速度。實(shí)際的應(yīng)用程序僅會(huì)重新計(jì)算渲染場(chǎng)景所必需的最小數(shù)據(jù)量,顯然會(huì)獲得更高的性能。幀速率包含了重新計(jì)算每個(gè)頂點(diǎn)3D坐標(biāo)和顏色的時(shí)間,以及圖像中每個(gè)像素顏色所需要的時(shí)間。

      在ParallelNsight中查看程序執(zhí)行時(shí)間,PerlinKernel只消耗了很短的(幾乎可以忽略不計(jì)的)執(zhí)行時(shí)間,執(zhí)行的時(shí)間主要耗費(fèi)在OpenGL的緩沖交換,需要多次進(jìn)行緩沖數(shù)據(jù)交換。

      在ParallelNsight中查看OpenGLAPI函數(shù)調(diào)用的情況,得到各種渲染方法的執(zhí)行時(shí)間:基元重啟,大約30μs,multidraw大約1900μs,逐一繪制各扇形:大約1000000μs。執(zhí)行時(shí)間雷達(dá)圖如下圖5所示。因?yàn)榛貑p少了PCIe總線上的數(shù)據(jù)傳輸,避免了數(shù)據(jù)傳輸對(duì)性能的影響,因此使用基元重啟比使用優(yōu)化的OpenGL的multiDraw()方法性能要高出1900/30=63倍。

      4結(jié)語(yǔ)

      本文研究了基于基元重啟的OpenGL和CUDA圖形渲染算法,在OpenGL和CUDA之間實(shí)現(xiàn)互操作的原理,OpenGL將內(nèi)存映射入CUDA內(nèi)存之后,利用CUDA進(jìn)行并行處理。但是如果兩者之間的數(shù)據(jù)需要頻繁交換,一定程度上會(huì)降低執(zhí)行效率。通過(guò)在傳輸數(shù)據(jù)上設(shè)置基元重啟標(biāo)志,一次傳輸?shù)臄?shù)據(jù)信息量大了,這樣降低了數(shù)據(jù)的交換次數(shù),提高了處理的速度。從實(shí)驗(yàn)結(jié)果上分析,采用OpenGL和CUDA混合編程改寫Perlin噪聲生成的人工地形程序比使用優(yōu)化的OpenGLMultiDraw()方法性能有了大幅度的提高。接下來(lái)需要解決的問(wèn)題是OpenGL和CUDA混合編程實(shí)現(xiàn)網(wǎng)絡(luò)攝像頭的現(xiàn)場(chǎng)視頻流處理。

      參考文獻(xiàn)

      [1]張權(quán).渲染技術(shù)在虛擬仿真中的應(yīng)用[J].電子制作,2015,(09):62-63.

      [2]QIAOShaojie,WANGYouwei,NIShengqiao.HighspeedimagerenderingmethodbasedonOpenGL[J].ComputerEngineeringandDesign,2011,47(21):47-49.(喬少杰,王有為,倪勝巧.基于OpenGL的快速圖像渲染方法[J].計(jì)算機(jī)應(yīng)用研究,2008,25(5):1589-1595.)

      [3]孫曉潔,葉樺,費(fèi)樹(shù)岷.基于OpenGL的混凝土泵車智能臂架系統(tǒng)仿真[J].科技通報(bào),2014(05):22-25.

      [4]吳恩華.輻射度技術(shù)用于隨機(jī)分維幾何面的全局光照計(jì)算[J].計(jì)算機(jī)學(xué)報(bào),2000,(05):321-323.

      [5]ZHAOJianbin,LILingqiao,YANGHuihua.Researchongraphicrenderingenginewiththreadlevelparallelismmethod[J].ComputerEngineeringandDesign,2011,47(21):47-49.(趙建斌,李靈巧,楊輝華.線程級(jí)并行計(jì)算在圖形渲染引擎中的研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2011,32(12):4143-4147.

      [6]RICHARDS.WRIGHT,JR.NicholasHaemel.OpenGlSuperBibleFifthEdition[M].北京:人民郵電出版社,2012:380-420.

      [7]李妮,陳錚,龔光紅.多核并行計(jì)算技術(shù)在景象匹配仿真中的應(yīng)用[J].系統(tǒng)工程與電子技術(shù),2010,32(2):428-432.

      [8]張林波,遲學(xué)斌,莫?jiǎng)t堯,等.并行計(jì)算導(dǎo)論[M].北京:清華大學(xué)出版社,2006:1-59.

      [9]RobFarber.CUDAApplicationDesignandDevelopment[M].北京:機(jī)械工業(yè)出版社,2012:178-185.

      [10]GORDERPF.Multicoreprocessorsforscienceandengineering[J].ComputinginScience&Engineering,2007,9(2):3-7.

      [11]NVIDIACUDAProgrammingGuide,version2.1[S].NVIDIA,2008.

      [12]項(xiàng)予,許森.基于Perlin噪聲的動(dòng)態(tài)水面實(shí)時(shí)渲染[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(11):3966-3969.

      第35卷第1期2016年3月計(jì)算技術(shù)與自動(dòng)化ComputingTechnologyandAutomationVol35,No1Mar.2016第35卷第1期2016年3月計(jì)算技術(shù)與自動(dòng)化ComputingTechnologyandAutomationVol35,No1Mar.2016

      大同市| 两当县| 利津县| 资中县| 闸北区| 奉新县| 乐东| 图木舒克市| 祁门县| 郧西县| 昌黎县| 宣化县| 临西县| 高清| 台北县| 新津县| 鸡泽县| 资源县| 探索| 双峰县| 司法| 通化县| 文成县| 当雄县| 娄底市| 长沙市| 宾川县| 綦江县| 萨嘎县| 兰考县| 信丰县| 舞阳县| 连南| 邛崃市| 仪征市| 山东| 井陉县| 弋阳县| 长沙市| 延津县| 宜良县|