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

        ?

        基于OpenGL細(xì)分著色器的實(shí)時(shí)爆炸模擬

        2018-11-20 11:54:10全偉衡
        現(xiàn)代計(jì)算機(jī) 2018年30期
        關(guān)鍵詞:著色器球體球面

        全偉衡

        (四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)

        0 引言

        現(xiàn)今,無論是在游戲場(chǎng)景還是影視特技等領(lǐng)域中,爆炸特效無疑增強(qiáng)了其視覺效果。而在爆炸過程中,爆炸球體的不規(guī)則性以及爆炸之后所產(chǎn)生的煙霧的離散性都增加了模擬工作的難度。

        爆炸特效的模擬可視為一種特殊的流體模擬,目前爆炸模擬方法主要有以下三個(gè):數(shù)字物理模擬[10-11]、粒子系統(tǒng)模擬[6-7]、過程紋理模擬[8-9]。其中數(shù)字物理模擬方法主要是通過求解Navier-Stokes方程來得到所需數(shù)據(jù),該方法模擬過程復(fù)雜且計(jì)算量大;粒子系統(tǒng)模擬是利用大量的粒子模擬爆炸特效狀態(tài),但這種方法在攝像機(jī)漫游的場(chǎng)景中很難得到真實(shí)立體的爆炸效果。過程紋理模擬是一種從爆炸特效的外觀和人類視覺角度分析、簡(jiǎn)化的快速算法,此方法的最大缺陷在于對(duì)于每一種新的紋理都需要大量時(shí)間去調(diào)參來獲得合適的函數(shù)。

        而在GPU PRO6一書中由Alex[1]提出了一種基于DirectX以及體積渲染技術(shù)的實(shí)時(shí)爆炸模擬。但文中重點(diǎn)強(qiáng)調(diào)的是爆炸球體的產(chǎn)生及色彩模擬,而在虛擬戰(zhàn)場(chǎng)中的爆炸需要的是一個(gè)完整的爆炸過程:球體由小變大至最激烈時(shí)刻爆炸,之后球體破散成煙霧狀消散。Alex所提出的方法雖然能比較真實(shí)地模擬球體表面隨局部爆炸劇烈變化的效果,但此方法所模擬出來的煙霧難以形成爆炸后的煙霧消散的狀態(tài)。

        通過研究,充分結(jié)合了過程紋理與Alex所提出的體積化渲染方法,實(shí)現(xiàn)了對(duì)虛擬戰(zhàn)場(chǎng)有一定應(yīng)用價(jià)值的爆炸模擬。

        1 爆炸模擬概述

        對(duì)于爆炸模擬的整體流程,此次共分為三個(gè)部分:產(chǎn)生爆炸球體、為球體著色,以及產(chǎn)生爆炸煙霧。此節(jié)給出了每個(gè)階段的算法思路。

        1.1 生成爆炸球體

        現(xiàn)實(shí)的爆炸瞬間所產(chǎn)生的體積形狀類似球體,其表面并不像普通球面那么光滑,而是會(huì)有一些凹凸,從而形成爆炸的層次感。

        此階段產(chǎn)生爆炸球體是利用OpenGL中的細(xì)分著色器的特性來產(chǎn)生一系列頂點(diǎn),而不需要額外的外部頂點(diǎn)輸入,接著用球面坐標(biāo)系的特性將所生成的一系列的頂點(diǎn)映射到虛擬的單位球面,這樣即可產(chǎn)生一個(gè)光滑的球面。

        有了球面之后則只需要將其表面制造凹凸感,以使球體更貼近現(xiàn)實(shí)中爆炸球體。生成爆炸球體所用的方法為利用噪聲函數(shù)為每一個(gè)頂點(diǎn)生成一個(gè)噪聲值,之后將頂點(diǎn)沿著頂點(diǎn)到球心的方向偏移一段距離,此段距離受上述的噪聲值影響,從而形成球面凹凸的效果。

        1.2 球體著色

        爆炸球體的著色大致可分為三個(gè)階段。第一個(gè)階段時(shí),爆炸球體為炙白高亮,并且球體慢慢增大;第二個(gè)階段時(shí),爆炸球體為白、黃、紅的混合色,并會(huì)出現(xiàn)刺眼的黃或紅色;第三個(gè)階段時(shí),爆炸球體為黃、紅、灰的混合色,且顏色會(huì)向全灰色轉(zhuǎn)變,接著會(huì)出現(xiàn)球體的破散從而形成煙霧。

        由于爆炸整個(gè)過程,每個(gè)頂點(diǎn)或是整個(gè)球體,其顏色的混合并不是固定的。因此在渲染爆炸球體顏色的時(shí)候,為球體著色采用噪聲來影響顏色梯度紋理采樣坐標(biāo),從而使得球體表面顏色能夠隨時(shí)間不斷變化,由此來體現(xiàn)不同的爆炸階段。

        1.3 生成爆炸消散效果

        現(xiàn)實(shí)中的爆炸,在球體高亮之后將轉(zhuǎn)為灰色,并且球體將會(huì)隨機(jī)破散,最終形成離散的煙霧。煙霧離散的特性可以借助OpenGL中Shader的特有變量來進(jìn)行實(shí)現(xiàn)。

        2 生成爆炸球體

        Tessellation階段是OpenGL渲染管道中的頂點(diǎn)處理階段,這個(gè)階段由細(xì)分控制著色器和細(xì)分計(jì)算著色器及固定功能階段組成。OpenGL中的細(xì)分著色器一般作用為:將一個(gè)圖元,如三角形、線等的內(nèi)部繼續(xù)細(xì)分,增加其細(xì)節(jié),使得其幾何特性更加明顯。例如:外部輸入一條直線,通過細(xì)分著色器可以產(chǎn)生一系列的頂點(diǎn)并通過算法映射到所期望得到的曲線上,最終則可以將一條直線變成一條曲線。爆炸球體的形成,其球體表面頂點(diǎn)的計(jì)算即應(yīng)用了細(xì)分著色器的這個(gè)特性。

        在細(xì)分控制著色器中,通過設(shè)定gl_TessLevelOuter[4]、gl_TessLevelInner[2]的值來確定一個(gè)Patch輸出的頂點(diǎn)數(shù)總量。細(xì)分級(jí)別來決定生成的頂點(diǎn)數(shù)量。

        首先,細(xì)分控制著色器產(chǎn)生一個(gè)Patch如圖1。接著將Patch上的每一個(gè)點(diǎn)與單位球體的球面上的點(diǎn)相對(duì)應(yīng)。當(dāng)細(xì)分著色器產(chǎn)生的頂點(diǎn)越多,則球面越光滑。如圖2與圖3所示,不同細(xì)分等級(jí)對(duì)于球面光滑度的影響。爆炸球體并不是純粹的球體,從現(xiàn)實(shí)中的觀察可以知道,在爆炸時(shí)期,其爆炸幾何體邊緣是不規(guī)則的,常出現(xiàn)一些類鋸齒形狀。因此需要將光滑的球體表面上的每個(gè)頂點(diǎn)分別進(jìn)行一定的偏移,使其相對(duì)位置發(fā)生改變,從而讓球體表面出現(xiàn)凹凸感。

        Simplex Noise是Ken Perlin在2001年所設(shè)計(jì)的新的噪聲函數(shù)。對(duì)于爆炸球體的模擬,應(yīng)用噪聲函數(shù)來使爆炸球體表面變得不規(guī)則是便捷的。

        對(duì)于三維Simplex Noise函數(shù),輸入為三維坐標(biāo),輸出為一個(gè)浮點(diǎn)數(shù),值域?yàn)閇0,1]。其結(jié)果具有一定隨機(jī)性,因此可利用此特性來變化球體表面。其過程如下:

        在CPU中應(yīng)用Simplex Noise函數(shù),將時(shí)間作為函數(shù)輸入?yún)?shù),之后運(yùn)行函數(shù)并將結(jié)果儲(chǔ)存到文本文件中。此步驟目的在于提前計(jì)算出一定數(shù)量噪聲值,之后將這些數(shù)據(jù)生成3維紋理,從而在爆炸模擬中,每個(gè)頂點(diǎn)對(duì)應(yīng)的噪聲值只需要通過對(duì)3維紋理進(jìn)行采樣來獲取,不再需要進(jìn)行噪聲函數(shù)的運(yùn)算,提高計(jì)算的效率。其次,將噪聲值用單獨(dú)的工程獨(dú)立生成一個(gè)文本,可以減少生成噪聲與爆炸模擬兩個(gè)工程之間的依賴性,方便在后續(xù)可以進(jìn)行噪聲的優(yōu)化和替換工作。

        圖1 細(xì)分著色器Patch

        圖2 內(nèi)外細(xì)分等級(jí)8

        圖3 內(nèi)外細(xì)分等級(jí)16

        3 爆炸球體著色

        在現(xiàn)實(shí)中,人眼所看到爆炸球體的顏色并不僅僅是其表面的顏色。爆炸由內(nèi)向外,最終人眼所見的顏色應(yīng)該是視線與爆炸表面相交的兩個(gè)交點(diǎn)之間區(qū)域上的顏色的混合體,如圖4。

        圖4 視線與球體相交

        圖5 計(jì)算視線出點(diǎn)

        圖6 著色紋理

        圖中P1為視線入點(diǎn),P2為視線出點(diǎn)。最終P1位置呈現(xiàn)到人眼中的顏色應(yīng)該為P1到P2線上所有顏色的一種混合,這種著色的方法被稱作Ray-Marching。

        本文使用的Ray-Marching算法是以P1點(diǎn)為起點(diǎn),P2點(diǎn)為終點(diǎn),且每次行進(jìn)的距離是一個(gè)固定值,稱之為固定步長(zhǎng),其總步數(shù)即為P1到P2之間的距離與固定步長(zhǎng)的商。最終顏色等于每一步顏色的權(quán)重和。

        Ray-Marching方法關(guān)鍵在于找出視線與球體的出點(diǎn)和顏色的混合函數(shù)。

        由于爆炸幾何體并不是一個(gè)完全對(duì)稱的球體,難以觀察到一些有效的幾何特征來輔助計(jì)算,即使在已知視點(diǎn)與爆炸體表面的一個(gè)頂點(diǎn)的情況下,求得視線與球體的精確出點(diǎn)仍然有難度。

        因此在此階段提出一個(gè)簡(jiǎn)便的、計(jì)算量小的估值方法如下:

        在著色的計(jì)算階段,隨著視線的行進(jìn),其計(jì)算出來的顏色值對(duì)于最終的顏色值的貢獻(xiàn)度將會(huì)越來越小,因此對(duì)于視線行進(jìn)的后階段可以選擇性忽略,可以用視線與爆炸球體的入點(diǎn)(圖5中的A點(diǎn))到球心的向量在視線方向上的投影來替代入點(diǎn)到出點(diǎn)的距離。

        圖5中AC為AB向量在視線方向的投影,即以C點(diǎn)來替代視線的出點(diǎn)。對(duì)于每一次的行進(jìn)所取得的顏色,本文采用的是結(jié)合顏色紋理與噪聲函數(shù)的方法。目的是為了使得每個(gè)頂點(diǎn)在每個(gè)時(shí)刻所取得的灰度值具有一定隨機(jī)性,以此來模擬爆炸球體色彩的多樣性。

        在Shader中,以其內(nèi)置的紋理采樣函數(shù)texture()對(duì)圖6的顏色紋理進(jìn)行采樣。每次使用的采樣坐標(biāo)是Ray-Marching中每次行進(jìn)的頂點(diǎn)坐標(biāo)值所對(duì)應(yīng)的噪聲值。由此可以得到行進(jìn)的每一步的灰度值。

        之后Ray-Marching算法每行進(jìn)一步其顏色權(quán)重減少為前一步的二分之一,即開始的一步的權(quán)重將會(huì)是最大,為0.5,之后的每一步的權(quán)重將會(huì)隨步數(shù)的增加越來越小。選擇此種方法來為每一步的顏色權(quán)重賦值的原因在于:Ray-Marching最開始的點(diǎn),即面向人眼的半球球面上的點(diǎn),其所具有的顏色是最先進(jìn)入人眼,因此它的顏色對(duì)于最終的顏色的影響最大;而之后行進(jìn)路線上所取得的灰度值對(duì)最終顏色的影響將會(huì)越來越小,最終效果也證明這種方法是可行的。

        在得到最終著色的爆炸球體,還需要對(duì)每一個(gè)頂點(diǎn)所對(duì)應(yīng)的噪聲值進(jìn)行一定處理來得到一個(gè)新的噪聲值,以使每一個(gè)時(shí)刻頂點(diǎn)所對(duì)應(yīng)的噪聲值的寬度增加。因?yàn)樵肼曋祵?shí)際上與顏色梯度圖具有對(duì)應(yīng)關(guān)系,當(dāng)噪聲值越大,所取得的灰度值將偏向圖6中所示顏色梯度圖的右側(cè)的顏色,同理,當(dāng)噪聲值越小,其所對(duì)應(yīng)的灰度值將偏向梯度圖左側(cè)的白色。故增加了噪聲取值的寬度以適應(yīng)顏色梯度,則可以使得在同一時(shí)刻的爆炸球面呈現(xiàn)出更多的顏色。

        4 爆炸煙霧模擬

        爆炸球體的消散效果可以借助OpenGL中Shader內(nèi)置的變量gl_ClipDistance[]。

        gl_ClipDistance變量是OpenGL用于向用戶提供一個(gè)控制裁剪的接口,而不依賴于OpenGL的自動(dòng)裁剪。gl_ClipDistance[i]指的是頂點(diǎn)到裁剪平面i的距離,而平面i的實(shí)例可由用戶自己指定。其中距離為0.0表示頂點(diǎn)在平面上,距離值為正代表頂點(diǎn)位于裁剪平面內(nèi),距離值為負(fù)意味著頂點(diǎn)位于裁剪平面之外。在后續(xù)的渲染階段,裁剪距離為負(fù)的頂點(diǎn)將會(huì)被裁剪,而距離大于或等于0的將會(huì)被保留。

        在進(jìn)行煙霧模擬時(shí)只需要控制每個(gè)頂點(diǎn)所對(duì)應(yīng)的裁剪距離,即使用的是gl_ClipDistance[0]來控制每個(gè)頂點(diǎn)到裁剪平面的距離。

        在默認(rèn)情況下,將每個(gè)頂點(diǎn)所對(duì)應(yīng)的gl_ClipDis?tance[0]設(shè)為頂點(diǎn)所對(duì)應(yīng)的噪聲值,由于噪聲值范圍為[0,1],因此在默認(rèn)情況下,任何頂點(diǎn)都不會(huì)被裁剪。之后加入時(shí)間這一維度,以方便控制球體消散時(shí)刻。

        5 程序運(yùn)行效果

        經(jīng)過程序測(cè)試,在未增加任何后處理的情況下,爆炸模擬各階段的如圖7-圖9。

        運(yùn)行程序的環(huán)境為:Intel i7 5700HQ處理器,NVIDIA GTX 980M顯卡,16G內(nèi)存。

        當(dāng)爆炸球體處于較小的狀態(tài)時(shí),調(diào)整細(xì)分等級(jí)處于較小的狀態(tài)可有效提高幀率,這一階段程序的幀率在400以上;爆炸時(shí)刻的球體色彩最多且所需頂點(diǎn)也較多,但此階段平均幀率處于180以上;煙霧產(chǎn)生階段其幀率會(huì)隨著頂點(diǎn)被裁剪而逐漸增加,此階段最低幀率在140以上。

        為獲得發(fā)光球體的光暈效果,在程序中加入了三次向下采樣、四次高斯模糊、一次模糊圖合成及一次模糊圖與原圖合成的后處理步驟,各階段效率均仍在60幀以上,其效果如圖10-圖12。

        由此可以說明所述的爆炸模擬完全滿足實(shí)時(shí)渲染的要求,整個(gè)模擬包括爆炸的全過程且具有一定的真實(shí)性,完全可適用于虛擬戰(zhàn)場(chǎng)中的炮彈爆炸及其他一些易爆物品的爆炸效果模擬。

        圖7 生成爆炸小球體

        圖8 生成爆炸球體

        圖9 爆炸球體消散

        圖10 后處理生成爆炸小球體

        圖11 后處理生成爆炸球體

        圖12 后處理爆炸球體消散

        猜你喜歡
        著色器球體球面
        計(jì)算機(jī)生成均值隨機(jī)點(diǎn)推理三、四維球體公式和表面積公式
        基于UE4 實(shí)時(shí)射線追蹤技術(shù)的研究與探討
        基于Unity Shader石油泄漏現(xiàn)象模擬的研究
        基于IMx6的opengl圖形著色器開發(fā)研究
        球面檢測(cè)量具的開發(fā)
        廣告創(chuàng)意新方法——球體思維兩極法
        Heisenberg群上移動(dòng)球面法的應(yīng)用——一類半線性方程的Liouville型定理
        Optimization of rice wine fermentation process based on the simultaneous saccharification and fermentation kinetic model☆
        球面穩(wěn)定同倫群中的ξn-相關(guān)元素的非平凡性
        拉伸筋在球面拉伸件拉伸模具中的應(yīng)用
        河南科技(2014年6期)2014-02-27 14:06:32
        三级全黄的视频在线观看| 亚洲日韩国产精品不卡一区在线| 一区二区三区免费观看在线视频| 精品国产av一区二区三四区| 日本久久精品中文字幕| 国产精品99精品久久免费| 日本50岁丰满熟妇xxxx| 无码AV高潮喷水无码专区线| 日本一区二区不卡超清在线播放 | 少妇一区二区三区精选| 国产一区二区三区在线蜜桃| 宅男66lu国产在线观看| 色偷偷久久一区二区三区| 久久综合视频网站| 真实单亲乱l仑对白视频| 久久福利青草精品资源| 91青青草在线观看视频| 国产黄色三级一区二区三区四区 | 日本做受120秒免费视频| 亚洲av无码国产剧情| 波多野结衣一区二区三区免费视频| 中文字幕 在线一区二区| 国产亚洲午夜精品久久久| 国产精品无码一区二区三级 | 国产三级精品三级男人的天堂| 中文字幕日韩精品有码视频| 国产无套内射久久久国产| 国产精品午睡沙发系列| 亚洲一区不卡在线导航| 中文字幕人妻av一区二区| 午夜秒播久久精品麻豆| 国内精品久久久人妻中文字幕| 午夜精品久久久久久中宇| 久久久久亚洲AV片无码乐播| 亚洲国产精品成人一区二区三区| 日本一区二区国产精品| 伊人久久精品无码二区麻豆| 熟女熟妇伦av网站| 日本高清色惰www在线视频| 91久久国产精品综合| 中文字幕在线乱码一区|