• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于GPU加速的水下海洋環(huán)境光照模擬的研究

    2018-02-03 12:23:39張雨儂秦勃梁藝
    電腦知識(shí)與技術(shù) 2018年2期

    張雨儂 秦勃 梁藝

    摘要:該文依據(jù)FFT(快速傅立葉變換)方法創(chuàng)建水面三角網(wǎng)格,通過加載三角網(wǎng)格數(shù)據(jù)的計(jì)算水下光線,利用OpenGL在屏幕上繪制出水下海洋環(huán)境中的光照模擬效果,再使用GPU并行算法對(duì)計(jì)算過程進(jìn)行優(yōu)化加速,最后通過使用OpenGL的VBO(頂點(diǎn)緩沖區(qū)對(duì)象)和VAO(頂點(diǎn)數(shù)組對(duì)象)兩種方式來實(shí)現(xiàn)兩者的交互。通過優(yōu)化數(shù)據(jù)結(jié)構(gòu)及存儲(chǔ)器分配,有效緩解了模擬方法在GPU架構(gòu)上的性能瓶頸。實(shí)驗(yàn)結(jié)果表明,該方法能夠?qū)崟r(shí)逼真地模擬水下光照,與已有的方法相比處理速度有顯著的提升。

    關(guān)鍵詞:光照模擬;GPU加速;OpenGL;像素緩沖區(qū)對(duì)象;頂點(diǎn)緩沖區(qū)對(duì)象

    中圖分類號(hào):TP302 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)02-0271-05

    Research on Underwater Marine Environment Lighting Simulation Based on GPU Acceleration

    ZHANG Yu-nong, QIN Bo, LIANG Yi

    (Department of Computer Science & Technology, Ocean University of China, Qingdao 266100,China)

    Abstract: In this paper, according to the FFT (Fast Fourier Transform) method to create the surface triangular grid, by loading triangular grid data to calculate the underwater light, using OpenGL on the screen to draw the underwater marine environment in the light simulation effect, and then use the GPU parallel algorithm pair The process of optimization to accelerate, and finally through the use of OpenGL VBO (vertex buffer object) and VAO (vertex array object) in two ways to achieve the interaction between the two. By optimizing the data structure and memory allocation, effectively alleviate the performance bottleneck of the simulation method on the GPU architecture. The experimental results show that the method can simulate the underwater lighting in real time, and the processing speed is significantly improved compared with the existing methods.

    Key words: lighting simulation; GPU acceleration; OpenGL; pixel buffer object; vertex buffer object

    1 概述

    近年來,“智慧海洋”逐漸成為海洋信息智能化發(fā)展最前沿的課題之一。水下光照的模擬是海洋虛擬場(chǎng)景模擬中的一個(gè)重要的課題,由于受到海洋復(fù)雜多變的環(huán)境影響,水下光線可能會(huì)產(chǎn)生折射、焦散、衰減等現(xiàn)象,而為了實(shí)現(xiàn)更加逼真的渲染效果,如何提高程序的并行性和計(jì)算效率、提高渲染的實(shí)時(shí)性成為了國(guó)內(nèi)外學(xué)者研究的一個(gè)難點(diǎn)。

    2001年,Mitchell[1]和Dobashi[2]通過將視域體分割成平行的平面來渲染水下光束,每個(gè)分割平面上采用Godray模型計(jì)算光強(qiáng)積分,并將結(jié)果累加到幀緩存中,陰影通過映射來實(shí)現(xiàn)。2001年,Jensen[3]通過把視域體分割成32個(gè)切片來表示光強(qiáng),使用體渲染技術(shù)來渲染,并且將一個(gè)有動(dòng)畫效果的焦散紋理投射到每一個(gè)切片上。2002年,Iwasaki[4,5,6]描述了一種基于物理模型的水下光束渲染的方法,為每個(gè)光束構(gòu)建一個(gè)平行六面體,并將其分割成若干子體,以準(zhǔn)確計(jì)算各個(gè)子體的光強(qiáng),最后把結(jié)果累加到幀緩存中;同樣,采用陰影映射方式描述陰影。

    2013年,方貴盛[7]對(duì)近年來水模擬的方法進(jìn)行了總結(jié),介紹了一些水體渲染的加速和改進(jìn)的方法。2009年Hilko Cords[8]在GPU上實(shí)現(xiàn)了浮動(dòng)物體與水面的交互。2010年,Prashant Goswamiy[9]等人提出了一種交互式SPH(Smoothed Particle Hydrodynamics)仿真和渲染的方法來實(shí)現(xiàn)高質(zhì)量的可視化。關(guān)鍵粒子的鄰域搜索基于Z索引和并行排序,利用模擬數(shù)據(jù)從SPH粒子云中有效地提取所有表面粒子,然后從表面顆粒光柵化后的部分快速生成距離場(chǎng),最后使用最先進(jìn)的GPU光線投射直接渲染距離場(chǎng)。2012年,NVIDIA在一個(gè)叫做Nalu[10]的演示中用圖像過濾器來模擬Godray。它首先將光線多次折射后照射到Nalu身上和頭發(fā)上,然后渲染陰影投射體,并將它們從明亮的像素中減去。最后,它可以快速的模糊圖像,制造出Godray的幻象。2011年,G?abor Liktor和Carsten Dachsbacher[11]提出了一個(gè)新穎的自適應(yīng)和可伸縮的渲染算法,可用于在表面或體積單散射焦散的實(shí)時(shí)渲染。利用了焦散圖和三角形體積的方法,捕獲光空間中的鏡面,但是跟蹤光束而不是單個(gè)光子。光束從光源投射到場(chǎng)景的表面上自適應(yīng)地生成,根據(jù)幾何和光子分布的不連續(xù)性被迭代地改進(jìn),這使得其能夠重建銳度體積的焦散圖案,同時(shí)降低散焦區(qū)域的采樣分辨率和填充率。endprint

    此外,有些學(xué)者使用了混合的方法來進(jìn)行模擬。2010年,Nuttapong Chentanez[12]結(jié)合基于網(wǎng)格和基于粒子的方法,都在CUDA中實(shí)現(xiàn)。2015年,E Darles,B Crespin[13]等人利用光譜和混合模型以及使用了Navier-Stokes方程來表示海洋表面,同時(shí)關(guān)注模擬泡沫和噴霧等現(xiàn)象以及光與海洋表面的相互作用。近年來osgEarth也越來越多地被用來渲染模擬海洋場(chǎng)景[14]。

    本文根據(jù)Iwasaki提出的基于物理模型的方法,結(jié)合最新的研究方法,對(duì)光照模擬的算法進(jìn)行了改進(jìn),使用CUDA8.0版本將水下光照模擬的計(jì)算過程在GPU上實(shí)現(xiàn),并在Maxwell架構(gòu)下的GTX960和Pascal架構(gòu)下的GTX1080上進(jìn)行測(cè)試、分析,充分利用CUDA并行計(jì)算的性能優(yōu)勢(shì),并通過使用OpenGL的VBO(頂點(diǎn)緩沖區(qū)對(duì)象)和VAO(頂點(diǎn)數(shù)組對(duì)象)兩種方式實(shí)現(xiàn)兩者的結(jié)合,優(yōu)化數(shù)據(jù)結(jié)構(gòu)以及存儲(chǔ)器分配,測(cè)試證明了這種算法有效緩解了在GPU架構(gòu)上的性能瓶頸,提高了程序執(zhí)行效率。

    2 模型與方法

    2.1 水下光照模型

    在Iwasaki提出的基于物理模型的方法中,使用了照明體來表現(xiàn)光柱。首先,計(jì)算到達(dá)視點(diǎn)的光強(qiáng)度時(shí),必須考慮由于水顆粒的光的散射。如圖1所示,當(dāng)視點(diǎn)位于水內(nèi)時(shí),使用公式1計(jì)算水面上的點(diǎn)Q到達(dá)視點(diǎn)Pv的光的強(qiáng)度Iv(λ)。

    如果觀察光線與水面的法線之間的角度小于臨界角,則強(qiáng)度IQ由公式2表示。

    如果觀察射線與水表面的法線之間的角度大于臨界角(48.6 度),則入射光是在水面(圖1中的P2)上一點(diǎn)處的反射光。因此,把在點(diǎn)P2處到達(dá)視點(diǎn)的反射光認(rèn)為是環(huán)境光,然后用環(huán)境光乘以P2Pv之間的水粒子的衰減比。

    光柱的強(qiáng)度由公式1的積分項(xiàng)計(jì)算。為簡(jiǎn)單起見,將積分項(xiàng)表示為Ishaft。如圖2所示,水面被細(xì)分為三角形網(wǎng)格,然后計(jì)算每個(gè)網(wǎng)格點(diǎn)處的折射矢量。

    照明體由每個(gè)掃描平面切片,并且照明體和掃描平面之間的交叉區(qū)域被定義為焦散三角形(如圖3)。散射光的積分等于觀察射線相交的焦散三角形的強(qiáng)度的總和。公式1的第二項(xiàng)Ishaft由公式3近似。

    [0LIPλexp-cλldl=iIpiλdiexp-cλli] (3)

    再使用公式4計(jì)算點(diǎn)P處的散射強(qiáng)度IP(λ)。

    [IPλ=IsunλTθii,θtiFpβλ,φ×exp-cλls+Iaρ] (4)

    渲染光柱的基本思想是顯示照明體的陰影正面。通過沿著觀察射線與照明體的交叉線段對(duì)散射光進(jìn)行積分來計(jì)算照明體的強(qiáng)度。如圖2所示,通過水平面將每個(gè)照明體細(xì)分為幾個(gè)子體積。由于在水表面處折射的太陽光的強(qiáng)度被指數(shù)地衰減,使沿著子體積的散射光的強(qiáng)度可以線性近似。這也使得可以通過使用Gouraud陰影功能來顯示照明體。

    在Iwasaki的方法中,對(duì)每一個(gè)光柱都做如下處理:首先將光柱分為子體積,刪除自相交的子體積,然后對(duì)子體積重復(fù)如下過程:

    (1) 將每個(gè)子體積細(xì)分為三個(gè)四面體。

    (2) 將每個(gè)四面體投影到屏幕上。

    (3) 將四面體分為兩種情況,一種是投影到屏幕前的,一種是投影到屏幕后的,然后分別處理。

    (4) 計(jì)算三角形頂點(diǎn)的強(qiáng)度。

    (5) 顯示三角形并在幀緩沖區(qū)中累加強(qiáng)度。

    該方法以在子體積內(nèi)沿著觀察射線聚集散射光的強(qiáng)度,通過繪制子體積的三個(gè)四面體來渲染光柱。然而通過這種方法計(jì)算四面體的光強(qiáng)雖然能夠減少計(jì)算時(shí)間,但是卻失去了計(jì)算的準(zhǔn)確性,本文中采用直接計(jì)算的方法,通過計(jì)算光柱側(cè)面中點(diǎn)來繪制光柱,使得渲染的光柱更具真實(shí)性。

    如圖4所示,在由六個(gè)點(diǎn)Pi(i = 1,...,6)組成的子體積中,關(guān)注P1P4和P3P6兩條光線。由于光線照射到水下以后會(huì)發(fā)生折射,所以P1P4和P3P6兩條光線并不一定共面,不能直接用四個(gè)頂點(diǎn)繪制成兩個(gè)三角形來表現(xiàn)光柱。此時(shí),我們用這四個(gè)頂點(diǎn)的坐標(biāo)依據(jù)公式5求出一個(gè)中點(diǎn)的坐標(biāo)位置。通過公式6計(jì)算子體積點(diǎn)Pi處的強(qiáng)度IPi。

    [IPiλ=IsPiλexp-cλli] (6)

    使用中點(diǎn)坐標(biāo)和四個(gè)頂點(diǎn)分別可以繪制出四個(gè)三角形面,對(duì)于每一個(gè)子體積需要計(jì)算出三個(gè)側(cè)面中點(diǎn),繪制12個(gè)小三角形,最后渲染這些小三角形表現(xiàn)光柱。對(duì)于光柱的強(qiáng)度,我們使用公式7的積分值來進(jìn)行計(jì)算。

    [Ic=0TIb-IaTt+Iadt=Ia+Ib2T] (7)

    2.2 GPU架構(gòu)

    圖形處理器(GPU)是處理計(jì)算機(jī)圖形的專用設(shè)備,近年來, GPU逐漸發(fā)展成為高并行度、多線程、多核的處理器,可以滿足高清晰度復(fù)雜圖形實(shí)時(shí)處理的需求。2007年6月, NVIDIA公司推出了統(tǒng)一計(jì)算設(shè)計(jì)架構(gòu)CUDA(Compute Unified Device Architecture),作為一種GPU的編程方法,它提供了豐富的高性能數(shù)學(xué)函數(shù)庫(kù),可在NVIDIA的GPU上運(yùn)行,目前已發(fā)布CUDA8.0版本。

    Pascal架構(gòu)是NVIDIA公司推出的第6代GPU架構(gòu),相對(duì)于Maxwell架構(gòu),Pascal架構(gòu)還引入了不少新技術(shù),提供了更強(qiáng)大的性能。

    (1) 擁有超高的浮點(diǎn)運(yùn)算性能,提供了5.3Tflops雙精度運(yùn)算性能,9Tflops單精度浮點(diǎn)運(yùn)算性能和21.2Tflops半精度運(yùn)算性能。

    (2) NVLink技術(shù),能支持多GPU間或者CPU與GPU間的通信,雙向通信帶寬可達(dá)到160GB/s。

    (3) 引入HBM2高速GPU存儲(chǔ)架構(gòu),訪存帶寬同比增長(zhǎng)3倍,最高可達(dá)720GB/s。

    (4) 引入統(tǒng)一存儲(chǔ)空間,提供了CPU和GPU存儲(chǔ)的統(tǒng)一地址空間。endprint

    (5) 計(jì)算搶占:允許計(jì)算任務(wù)在指令級(jí)被中斷,可以打破kernel函數(shù)的運(yùn)行時(shí)間限制,不必考慮超時(shí)問題。

    2016年5月7日,NVIDIA公司正式發(fā)布了新一代旗艦顯卡GeForce GTX 1080。它采用Pascal架構(gòu),擁有2560個(gè)CUDA處理器,160個(gè)紋理單元,核心頻率為1607MHz,計(jì)算能力可以達(dá)到6.0。相比之前的Maxwell架構(gòu),Pascal架構(gòu)對(duì)SM再一次做了提升,GTX1080的核心為GP104,包含4組GPC,每個(gè)GPC包含5個(gè)SM,每個(gè)SM中集成了128個(gè)CUDA單元、8個(gè)紋理單元、256KB的二級(jí)緩存、96KB的共享儲(chǔ)存空間以及48KB的一級(jí)緩存。圖5為核心GP104中一個(gè)SM的架構(gòu)示意圖。

    2.3 CUDA和OpenGL的交互

    OpenGL是圖形硬件的一種軟件接口,也是一個(gè)3D圖形和模型庫(kù),具有高度的可移植性,并且有非??斓乃俣取UDA和OpenGL交互操作的基本方式是使用CUDA計(jì)算生成數(shù)據(jù),然后使用OpenGL在屏幕上繪制出數(shù)據(jù)所表示的圖形。兩者的結(jié)合可以通過兩種方式來實(shí)現(xiàn):

    (1) 使用OpenGL的PBO(像素緩沖區(qū)對(duì)象)。在該方式下,CUDA直接生成像素?cái)?shù)據(jù),OpenGL顯示這些像素;

    (2) 使用OpenGL的VBO(頂點(diǎn)緩沖區(qū)對(duì)象)。在該方式下,CUDA生成頂點(diǎn)網(wǎng)格數(shù)據(jù),OpenGL可以根據(jù)需要繪制出平滑的表面圖或線框圖或一系列頂點(diǎn)。

    在本文中,我們使用VBO和VAO(Vertex Array Object)相結(jié)合的方式來存儲(chǔ)數(shù)據(jù),以達(dá)到CUDA和OpenGL的交互過程。首先,使用VBO存儲(chǔ)頂點(diǎn)數(shù)據(jù),包括頂點(diǎn)顏色、坐標(biāo)、法線,以及頂點(diǎn)的indices,把本地(GL客戶端)的數(shù)據(jù)完全交給GPU(GL服務(wù)端)來管理,可以映射到CUDA的地址空間,當(dāng)做global memory被訪問。其次,使用VAO存儲(chǔ)GPU將怎么使用VBO里面的數(shù)據(jù),以及頂點(diǎn)數(shù)據(jù)中哪些是坐標(biāo)、哪些是顏色、哪些是法線等信息,沒有了額外的opengles數(shù)據(jù)交互,節(jié)省了渲染時(shí)間。

    3 優(yōu)化與加速

    3.1 程序基本框架與流程

    在本文中,程序運(yùn)行的基本流程如圖6所示:

    (1) 建立笛卡爾坐標(biāo)系,y軸表示海底到海面的高度,x軸和z軸表示海平面的兩個(gè)方向。加載海底地形數(shù)據(jù),包括網(wǎng)格坐標(biāo)、法線和海底地形的類型。

    (2) 使用FFT的方法繪制海面三角網(wǎng)格,本文中使用的海面網(wǎng)格大小為256*256,以坐標(biāo)原點(diǎn)為中心,x軸和z軸正負(fù)兩個(gè)方向上各有128個(gè)網(wǎng)格點(diǎn)。

    (3) 根據(jù)虛擬的光線照射方向,計(jì)算光線通過水面以后的折射方向,保存光線照射到海底的坐標(biāo)。

    (4) 將數(shù)據(jù)傳到GPU端,根據(jù)相鄰兩條光線四個(gè)點(diǎn)的坐標(biāo)計(jì)算出一個(gè)中點(diǎn)坐標(biāo)以及該點(diǎn)的顏色值,進(jìn)而確定一條光柱三個(gè)側(cè)面的中點(diǎn)的坐標(biāo)以及該點(diǎn)的顏色值。

    (5) 根據(jù)光線計(jì)算海底焦散點(diǎn)的坐標(biāo)以及該點(diǎn)的顏色值。

    (6) 將計(jì)算結(jié)果保存在幀緩存中,更新網(wǎng)格數(shù)據(jù),并將數(shù)據(jù)傳回CPU端。

    (7) 刷新屏幕,根據(jù)網(wǎng)格數(shù)據(jù)渲染、繪制光柱。

    3.2 使用CUDA實(shí)現(xiàn)光照計(jì)算

    從Iwasaki的水下光照模型提出以后,該方法被廣泛應(yīng)用,在渲染水下光照?qǐng)鼍胺矫嬗兄芎玫男Ч?。但隨著渲染規(guī)模不斷擴(kuò)大,僅僅在CPU端進(jìn)行光柱的計(jì)算已無法滿足實(shí)時(shí)渲染的要求,為了達(dá)到更好的實(shí)時(shí)性,本文將光照的計(jì)算過程在GPU上使用CUDA來實(shí)現(xiàn),使得運(yùn)算過程高度并行化。

    在 CUDA 編程模型中,完整的CUDA程序包括主機(jī)端和設(shè)備端兩部分代碼,主機(jī)端代碼在CPU上執(zhí)行,設(shè)備端代碼又稱為kernel運(yùn)行在GPU上。kernel函數(shù)調(diào)用時(shí)根據(jù)線程維度<<>>,以block為單位映射到SM中,執(zhí)行時(shí)以warp為單位。而影響kernel函數(shù)執(zhí)行性能的相關(guān)因素包括了CUDAcore的計(jì)算能力、分支處理、線程切換開銷、存儲(chǔ)訪問、occupancy(占用率)等。

    本文對(duì)水下光柱和海底焦散兩部分計(jì)算實(shí)現(xiàn)了并行處理。首先,對(duì)于海底焦散的計(jì)算,設(shè)置每個(gè)線程計(jì)算一個(gè)三角網(wǎng)格,根據(jù)法線方向計(jì)算三條光線折射到海底的焦散點(diǎn)坐標(biāo),根據(jù)光強(qiáng)計(jì)算出海底焦散的顏色值,將計(jì)算結(jié)果保存在VAO中。對(duì)于水下光柱的計(jì)算,設(shè)置每個(gè)線程計(jì)算一個(gè)三角網(wǎng)格,根據(jù)三個(gè)頂點(diǎn)與三個(gè)焦散點(diǎn)的坐標(biāo)、顏色值計(jì)算側(cè)面的中點(diǎn)坐標(biāo)以及該中點(diǎn)的顏色值,最后將結(jié)果保存在VBO中。

    3.3 OpenGL中VBO和VAO的結(jié)合

    在水下海洋環(huán)境水體模擬的過程中,由于海面會(huì)受到風(fēng)場(chǎng)、流場(chǎng)等環(huán)境因素的影響,為了使渲染效果更加逼真,往往需要根據(jù)環(huán)境的變化實(shí)時(shí)的進(jìn)行數(shù)據(jù)更新以及場(chǎng)景渲染。因此,海面網(wǎng)格數(shù)據(jù)的更新速度就成為了影響水下場(chǎng)景渲染速度的重要因素。為了解決這一問題,本文將加載的頂點(diǎn)數(shù)據(jù)保存在VBO和VAO中,給它一個(gè)偏移量(offset)來指定我們打算填充緩沖的位置與起始位置之間的偏移量,然后我們可以將加載的位置數(shù)組、法線數(shù)組和紋理坐標(biāo)數(shù)組結(jié)合為交叉數(shù)據(jù),實(shí)現(xiàn)分批處理。隨后,GPU端將計(jì)算結(jié)果傳回CPU端,同時(shí)返回重復(fù)計(jì)算過程,CPU端刷新屏幕,使用更新后的數(shù)據(jù)進(jìn)行繪制和渲染。這種方法極大地提高了數(shù)據(jù)訪問的速度,提高了程序運(yùn)行效率,具體實(shí)現(xiàn)方法如下:

    (1) 創(chuàng)建VAO、VBO

    glGenVertexArrays(1, &seaVAO); //創(chuàng)建VAO

    glBindVertexArray(seaVAO);

    glGenBuffers(1, &seaTexCoordVBO);//創(chuàng)建VBO

    glBindBuffer(GL_ARRAY_BUFFER, seaTexCoordVBO);

    (2) 注冊(cè)、映射VBO

    checkCudaErrors(cudaGraphicsGLRegisterBuffer(cuda_vbo_resource, vbo, cudaGraphicsMapFlagsNone));

    checkCudaErrors(cudaGraphicsMapResources(1, cuda_vbo_resource, 0));

    checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void **)&ptr, &num_bytes, *cuda_vbo_resource));

    (3) 使用

    __global__ void UpdateGodrayVBOKernel(float * d_godray_data, int3 Sz, DIFDATA* d_ppData)

    (4) 填充緩沖

    glBufferData(GL_ARRAY_BUFFER, sea_Size* sizeof(float), NULL, GL_DYNAMIC_DRAW);

    (5) 解除映射、注冊(cè)

    checkCudaErrors(cudaGraphicsUnmapResources(1, cuda_vbo_resource, 0));

    unmapGLBufferObject(cuda_vbo_resource);

    (6) 刪除VAO、VBO

    m_pListTerrain.clear();

    for (int i = 0; i < m_pListTerrainVBO.size(); i++)

    glDeleteBuffers(1, &m_pListTerrainVBO[i]);

    m_pListTerrainVBO.clear();

    for (int i = 0; i < m_pListTerrainVAO.size(); i++)

    glDeleteVertexArrays(1, &m_pListTerrainVAO[i]);

    m_pListTerrainVAO.clear();

    4 測(cè)試與結(jié)果

    4.1 測(cè)試環(huán)境

    本文使用的CUDA版本為8.0,實(shí)驗(yàn)采用的機(jī)器配置為:Intel Core i5-4430,雙核四線程,主頻3.0GHz,內(nèi)存8GB,使用了NVIDIA GTX960和GTX1080兩種顯卡,顯卡性能對(duì)比見表1。

    4.2 測(cè)試結(jié)果

    本文中測(cè)試窗口像素設(shè)置為1600×900,網(wǎng)格大小為256×256,在沒有使用GPU加速的原始程序中,F(xiàn)ps(幀率)為64,使用了GPU加速以后,在GTX960和GTX1080兩種顯卡上分別使用1、4、16、64、256、1024個(gè)線程進(jìn)行測(cè)試,所得測(cè)試結(jié)果見表2,程序運(yùn)行效果如圖7所示。

    由于硬件設(shè)備的限制,每個(gè)Block中的線程數(shù)最大不能超過1024,然而并不是每個(gè)Block中的線程數(shù)越多計(jì)算速度越快,這是因?yàn)槭艿搅思拇嫫鲾?shù)的限制。根據(jù)GTX960和GTX1080兩種顯卡的硬件架構(gòu),每個(gè)Block中最多有65536個(gè)寄存器,當(dāng)寄存器超出了限制時(shí)就會(huì)有一部分線程無法執(zhí)行,此時(shí)計(jì)算效率不僅不會(huì)提高反而會(huì)下降,因此當(dāng)寄存器數(shù)剛好達(dá)到滿載時(shí)Block的計(jì)算效率達(dá)到理論上的最高值。而對(duì)于如何選擇最合適的線程數(shù)目以及Block數(shù)以達(dá)到程序的最高效率,就需要通過測(cè)試來進(jìn)行分析選擇。

    本文中的算法通過測(cè)試,我們發(fā)現(xiàn)當(dāng)線程數(shù)為16時(shí)計(jì)算速度最快,效率最高,幀率在GTX960上可以達(dá)到172幀,在GTX1080上可以達(dá)到253幀。

    表3是原始程序和加速后程序的計(jì)算效率對(duì)比,不妨設(shè)原始程序的計(jì)算能力為1.00,則在GTX960上加速后提高了1.68倍,在GTX1080上提高了2.95倍。

    5 結(jié)論

    本文針對(duì)復(fù)雜海洋環(huán)境中水下光照的計(jì)算與繪制,提出了一種基于GPU加速的水下海洋光照模擬的算法。該算法采用了高性能的GPU并行計(jì)算編程技術(shù),提高了光線計(jì)算的效率,并引入了OpenGL的VBO和VAO兩種方法,減少了通訊時(shí)間,提高了繪制的效率。最后通過對(duì)不同線程數(shù)的測(cè)試得出最佳運(yùn)行線程數(shù)。實(shí)驗(yàn)結(jié)果表明算法的執(zhí)行效率顯著提高,可以用于實(shí)時(shí)渲染水下海洋場(chǎng)景。

    參考文獻(xiàn):

    [1] Mitchell,J. “Light Shafts Rendering Shadows in Participating Media.” Available online at http://www.ati.com/developer/gdce/2001/jensen/jensen_01.htm

    [2] Dobashi, Y., T. Yamamoto, and T. Nishita. Interactive Rendering of Atmospheric Scattering Effects using Graphics Hardware. Proc. Graphics Hard-ware,2002: 99-108.

    [3] Staff L, Goliá? J R. Deep-water animation and rendering[C]// 2001.

    [4] Kei Iwasaki, Yoshinori Dobashi and Tomoyuki Nishita. An efficient method for rendering underwater optical effects using graphics hardware[J]. Computer Graphics forum. 2002, Volume 21(4):701-71.endprint

    [5] Iwasaki K, Yoshimoto F, Dobashi Y, et al. A Method for Fast Rendering of Caustics from Refraction by Transparent Objects[J]. IEICE - Transactions on Information and Systems, 2005, E88-D(5):904-911.

    [6] Iwasaki K, Furuya W, Dobashi Y, et al. Real‐time Rendering of Dynamic Scenes under All‐frequency Lighting using Integral Spherical Gaussian[J]. Computer Graphics Forum, 2012, 31(2pt3):727-734.

    [7] 方貴盛, 潘志庚. 水虛擬仿真技術(shù)研究進(jìn)展[J]. 系統(tǒng)仿真學(xué)報(bào), 2013, 25(9):1981-1989.

    [8] Hilko Cords. Real-Time Open Water Environments with Interacting Objects [C]// Proceedings of Eurographics Workshop on Natural Phenomena, Munich, Germany, 2009. New York, USA: ACM Press, 2009: 35-42.

    [9] Goswami P, Schlegel P, Solenthaler B, et al. Interactive SPH simulation and rendering on the GPU[C]// Eurographics/acm SIGGRAPH Symposium on Computer Animation, SCA 2010, Madrid, Spain. DBLP, 2010:55-64.

    [10] NVIDIAs Nalu Demo. Available online at http://www.nzone.com/object/nzone_nalu_home.html

    [11] Papadopoulos C, Papaioannou G. Realistic Real-time Underwater Caustics and Godrays[J]. Proc Graphicon, 2010.

    [12] Chentanez N. Real-time simulation of large bodies of water with small scale details[C]// Eurographics/acm SIGGRAPH Symposium on Computer Animation, SCA 2010, Madrid, Spain. DBLP, 2010:197-206.

    [13] Darles E, Crespin B, Ghazanfarpour D, et al. A Survey of Ocean Simulation and Rendering Techniques in Computer Graphics[J]. Computer Graphics Forum, 2015, 30(1):43-60.

    [14] 王銳, 錢學(xué)雷. Open Scene Graph 三維渲染引擎設(shè)計(jì)與實(shí)踐[M].北京:清華大學(xué)出版社,2009.endprint

    囊谦县| 泾阳县| 新民市| 鸡西市| 天全县| 华蓥市| 仁寿县| 绍兴县| 保亭| 宝鸡市| 伊通| 平远县| 天水市| 大埔区| 正镶白旗| 庄河市| 应用必备| 涪陵区| 苍梧县| 呼伦贝尔市| 武安市| 灵武市| 郑州市| 玛多县| 伊宁市| 班玛县| 宜君县| 瑞安市| 广汉市| 休宁县| 新干县| 全州县| 昭觉县| 喀喇沁旗| 遵义县| 安吉县| 白河县| 开封市| 夏津县| 个旧市| 开原市|