亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        張雨儂 秦勃 梁藝

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

        關鍵詞:光照模擬;GPU加速;OpenGL;像素緩沖區(qū)對象;頂點緩沖區(qū)對象

        中圖分類號:TP302 文獻標識碼:A 文章編號: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ā)展最前沿的課題之一。水下光照的模擬是海洋虛擬場景模擬中的一個重要的課題,由于受到海洋復雜多變的環(huán)境影響,水下光線可能會產生折射、焦散、衰減等現象,而為了實現更加逼真的渲染效果,如何提高程序的并行性和計算效率、提高渲染的實時性成為了國內外學者研究的一個難點。

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

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

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

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

        2 模型與方法

        2.1 水下光照模型

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

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

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

        光柱的強度由公式1的積分項計算。為簡單起見,將積分項表示為Ishaft。如圖2所示,水面被細分為三角形網格,然后計算每個網格點處的折射矢量。

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

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

        再使用公式4計算點P處的散射強度IP(λ)。

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

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

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

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

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

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

        (4) 計算三角形頂點的強度。

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

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

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

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

        使用中點坐標和四個頂點分別可以繪制出四個三角形面,對于每一個子體積需要計算出三個側面中點,繪制12個小三角形,最后渲染這些小三角形表現光柱。對于光柱的強度,我們使用公式7的積分值來進行計算。

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

        2.2 GPU架構

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

        Pascal架構是NVIDIA公司推出的第6代GPU架構,相對于Maxwell架構,Pascal架構還引入了不少新技術,提供了更強大的性能。

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

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

        (3) 引入HBM2高速GPU存儲架構,訪存帶寬同比增長3倍,最高可達720GB/s。

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

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

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

        2.3 CUDA和OpenGL的交互

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

        (1) 使用OpenGL的PBO(像素緩沖區(qū)對象)。在該方式下,CUDA直接生成像素數據,OpenGL顯示這些像素;

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

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

        3 優(yōu)化與加速

        3.1 程序基本框架與流程

        在本文中,程序運行的基本流程如圖6所示:

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

        (2) 使用FFT的方法繪制海面三角網格,本文中使用的海面網格大小為256*256,以坐標原點為中心,x軸和z軸正負兩個方向上各有128個網格點。

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

        (4) 將數據傳到GPU端,根據相鄰兩條光線四個點的坐標計算出一個中點坐標以及該點的顏色值,進而確定一條光柱三個側面的中點的坐標以及該點的顏色值。

        (5) 根據光線計算海底焦散點的坐標以及該點的顏色值。

        (6) 將計算結果保存在幀緩存中,更新網格數據,并將數據傳回CPU端。

        (7) 刷新屏幕,根據網格數據渲染、繪制光柱。

        3.2 使用CUDA實現光照計算

        從Iwasaki的水下光照模型提出以后,該方法被廣泛應用,在渲染水下光照場景方面有著很好的效果。但隨著渲染規(guī)模不斷擴大,僅僅在CPU端進行光柱的計算已無法滿足實時渲染的要求,為了達到更好的實時性,本文將光照的計算過程在GPU上使用CUDA來實現,使得運算過程高度并行化。

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

        本文對水下光柱和海底焦散兩部分計算實現了并行處理。首先,對于海底焦散的計算,設置每個線程計算一個三角網格,根據法線方向計算三條光線折射到海底的焦散點坐標,根據光強計算出海底焦散的顏色值,將計算結果保存在VAO中。對于水下光柱的計算,設置每個線程計算一個三角網格,根據三個頂點與三個焦散點的坐標、顏色值計算側面的中點坐標以及該中點的顏色值,最后將結果保存在VBO中。

        3.3 OpenGL中VBO和VAO的結合

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

        (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) 注冊、映射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) 解除映射、注冊

        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 測試與結果

        4.1 測試環(huán)境

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

        4.2 測試結果

        本文中測試窗口像素設置為1600×900,網格大小為256×256,在沒有使用GPU加速的原始程序中,Fps(幀率)為64,使用了GPU加速以后,在GTX960和GTX1080兩種顯卡上分別使用1、4、16、64、256、1024個線程進行測試,所得測試結果見表2,程序運行效果如圖7所示。

        由于硬件設備的限制,每個Block中的線程數最大不能超過1024,然而并不是每個Block中的線程數越多計算速度越快,這是因為受到了寄存器數的限制。根據GTX960和GTX1080兩種顯卡的硬件架構,每個Block中最多有65536個寄存器,當寄存器超出了限制時就會有一部分線程無法執(zhí)行,此時計算效率不僅不會提高反而會下降,因此當寄存器數剛好達到滿載時Block的計算效率達到理論上的最高值。而對于如何選擇最合適的線程數目以及Block數以達到程序的最高效率,就需要通過測試來進行分析選擇。

        本文中的算法通過測試,我們發(fā)現當線程數為16時計算速度最快,效率最高,幀率在GTX960上可以達到172幀,在GTX1080上可以達到253幀。

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

        5 結論

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

        參考文獻:

        [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] 方貴盛, 潘志庚. 水虛擬仿真技術研究進展[J]. 系統(tǒng)仿真學報, 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] 王銳, 錢學雷. Open Scene Graph 三維渲染引擎設計與實踐[M].北京:清華大學出版社,2009.endprint

        亚洲黄色一插一抽动态图在线看| 亚洲国产成人久久一区www| 精品人无码一区二区三区| 中文字幕一二区中文字幕| 国产白色视频在线观看| 久久国产色av免费观看| 久久天天躁夜夜躁狠狠躁2022| 麻豆久久久国内精品| 中文资源在线一区二区三区av| 久久国产精品偷任你爽任你 | 久久精品日本不卡91| 欧美a级毛欧美1级a大片免费播放| 国产精品jizz观看| 在线播放中文字幕一区二区三区| 久久人妻一区二区三区免费| 人人爽久久涩噜噜噜丁香| 特黄aa级毛片免费视频播放| 久久国产亚洲av高清色| 亚洲av日韩av卡二| 久久综合精品国产一区二区三区无码| 亚洲欧美日韩精品中文乱码| 亚洲精品综合久久中文字幕| 日本国产成人国产在线播放| 国模无码视频一区| 亚洲AV专区一专区二专区三| 青青草成人在线播放视频| 欧美乱人伦人妻中文字幕| 亚洲美女影院| 97超碰国产一区二区三区 | 免费操逼视频| 国产精品高潮无码毛片| 免费黄网站一区二区三区| 99在线精品免费视频| 天天影视色香欲综合久久| 国产人妖赵恩静在线视频| 国产日韩厂亚洲字幕中文| 91偷自国产一区二区三区| 欧美狠狠入鲁的视频777色| 国产精品福利影院| 白白白色视频在线观看播放| 亚洲熟女精品中文字幕|