一種實(shí)時(shí)體積霧化效果算法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)圖形學(xué)領(lǐng)域,尤其涉及一種實(shí)時(shí)體積霧化效果算法。
【背景技術(shù)】
[0002]在霧氣比較嚴(yán)重的地區(qū),往往距離觀察點(diǎn)很近的物體比較清晰,而遠(yuǎn)處的物體隨著距離的增加會(huì)變得越來越模糊。在計(jì)算機(jī)繪圖中,一般使用霧化在三維顯示中模擬真實(shí)世界的云霧、水汽和灰塵等自然景觀,增加三維場景的真實(shí)感。目前,像素霧化和頂點(diǎn)霧化由可以實(shí)現(xiàn)真實(shí)而高效的霧化渲染效果,能夠大大增強(qiáng)虛擬現(xiàn)實(shí)、3D視頻游戲、飛行仿真等實(shí)時(shí)圖形系統(tǒng)場景的真實(shí)感、沉浸感和縱深感,所以,得到了較多的關(guān)注和廣泛的使用。
[0003]在Direct3D圖形系統(tǒng)中,霧化是通過將景物顏色與霧的顏色,以混合因子混合而實(shí)現(xiàn)的,其中,混合因子隨物體到觀察點(diǎn)距離的增加而衰減。計(jì)算霧化的公式為:
[0004]color = f*colorscene+(1-f)*colorfog
[0005]其中,colorscene為物體的顏色,colorfog為霧的顏色,f為混合因子,color為霧化后的顏色,即霧化效果。
[0006]從公式中可以看出,影響霧化效果的因素主要包括混合因子和霧的顏色,一般情況下,霧的顏色為白色或背景色,所以,影響霧化效果的因素主要是混合因子,這樣,霧化效果算法的關(guān)鍵點(diǎn)就是如何確定混合因子。
[0007]目前,Direct3D提供的確定混合因子的方法主要包括以下三種:
[0008](1.D3DF0G_LINEAR
[0009]F = (end-d) / (end-start)
[0010]其中,F(xiàn)表示混合因子,start表示霧起始的深度,end表示霧終止的深度,d表示當(dāng)前點(diǎn)距觀測點(diǎn)的距離;
[0011](2.D3DF0G_EXP
[0012]P = e-d*density
[0013]其中,F(xiàn)表示混合因子,d表示當(dāng)前點(diǎn)距觀測點(diǎn)的距離,density表示霧的密度;
[0014](3.D3DF0G_EXP2
[0015]F = e_(d*density)2
[0016]其中,F(xiàn)表示混合因子,d表示當(dāng)前點(diǎn)距觀測點(diǎn)的距離,density表示霧的密度。
[0017]但是,上述3種方法得到的混合因子,應(yīng)用于霧化中,僅僅能夠?qū)崿F(xiàn)基本的霧化效果,如果需要模擬更復(fù)雜的、更真實(shí)自然的效果,往往還需要根據(jù)應(yīng)用需求的不同,另外構(gòu)建其他公式或算法,因此,在圖形系統(tǒng)的霧化渲染技術(shù)中應(yīng)用率很低。
【發(fā)明內(nèi)容】
[0018]本發(fā)明的目的在于提供一種實(shí)時(shí)體積霧化效果算法,從而解決現(xiàn)有技術(shù)中存在的前述問題。
[0019]為了實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下:
[0020]一種實(shí)時(shí)體積霧化效果算法,包括如下步驟:
[0021]SI,從Z-Buffer與Frame-Buffer中,獲取每個(gè)像素點(diǎn)的深度信息,所述深度信息包括場景深度信息、霧正面深度信息和霧背面深度信息;
[0022]S2,將所述深度信息保存到深度紋理圖片上,具體包括:將所述場景深度信息保存到場景深度紋理圖片上;將所述霧正面深度信息保存到霧正面深度紋理圖片上;將所述霧背面深度信息保存到霧背面深度紋理圖片上;
[0023]S3,在可編程流水線中,調(diào)用HLSL取樣函數(shù),從所述深度紋理圖片中調(diào)取深度值,具體包括:從所述場景深度紋理圖片中調(diào)取場景深度值,從所述霧正面深度紋理圖片中調(diào)取霧正面深度值,從所述霧背面深度紋理圖片中調(diào)取霧背面深度值;
[0024]S4,根據(jù)所述深度值計(jì)算霧所占距離,即視點(diǎn)與目標(biāo)象素點(diǎn)的距離上霧所占的距離;所述深度值包括所述場景深度值、所述霧正面深度值和所述霧背面深度值
[0025]S5,根據(jù)所述霧所占距離和霧的濃度,利用如下公式計(jì)算混合因子:
[0026]float Disfactor = clamp(dis/FogDensity, 0, I);
[0027]式中,
[0028]Disfactor,混合因子,其取值區(qū)間為(0,I);
[0029]di S,霧所占距離;
[0030]FogDensity,霧的濃度;
[0031]S6,根據(jù)所述混合因子、模型紋理顏色值和霧的濃度,計(jì)算并返回混合后的顏色值;
[0032]S7,在3D圖形渲染中,根據(jù)所述返回的混合后的顏色值霧化渲染場景,得到實(shí)時(shí)體積霧化效果。
[0033]進(jìn)一步地,SI之前,還包括步驟S0,獲取Z-Buffer與Frame-Buffer。
[0034]優(yōu)選地,S2中所述將所述深度信息保存到深度紋理圖片上,使用MultiRenderTarget 技術(shù)。
[0035]優(yōu)選地,S3中,所述取樣函數(shù)為HLSL內(nèi)置函數(shù)tex2D (s,t)。
[0036]進(jìn)一步地,S3和S4之間還包括步驟:
[0037]按照設(shè)定的第一規(guī)則,將float類型的深度值轉(zhuǎn)換成float4類型的A\R\G\B顏色值并進(jìn)行保存,其中,透明度值A(chǔ)為不透明,R、G、B的數(shù)值均小于I大于等于O ;
[0038]按照設(shè)定的第二規(guī)則將float4類型的A\R\G\B顏色值轉(zhuǎn)換成float類型的深度值并進(jìn)行調(diào)用,其中,所述第二規(guī)則為所述第一規(guī)則的相反的邏輯規(guī)則。
[0039]優(yōu)選地,所述設(shè)定的第一規(guī)則為:
[0040]將所述深度值除以設(shè)定的系數(shù),得到第一結(jié)果,如果所述第一結(jié)果包括整數(shù)部分和小數(shù)部分,則將所述第一結(jié)果中的小數(shù)部分做為R的數(shù)值予以保存,將所述第一結(jié)果中的整數(shù)部分除以所述設(shè)定的系數(shù),得到第二結(jié)果;如果所述第二結(jié)果包括整數(shù)部分和小數(shù)部分,則將所述第二結(jié)果中的小數(shù)部分做為G的數(shù)值予以保存,將所述第二結(jié)果中的整數(shù)部分除以所述設(shè)定的系數(shù),得到第三結(jié)果;如果所述第三結(jié)果包括整數(shù)部分和小數(shù)部分,則將所述第三結(jié)果中的小數(shù)部分做為B的數(shù)值予以保存,并結(jié)束;
[0041]如果所述第一結(jié)果只包括整數(shù)部分,則將O做為R的數(shù)值予以保存;將所述第一結(jié)果的整數(shù)部分除以所述設(shè)定的系數(shù),得到第二結(jié)果,將所述第二結(jié)果中的小數(shù)部分作為G的數(shù)值予以保存;將所述第二結(jié)果中的整數(shù)部分除以所述設(shè)定系數(shù),得到第三結(jié)果,將所述第三結(jié)果中的小數(shù)部分作為B的數(shù)值值予以保存,并結(jié)束;
[0042]如果所述第一結(jié)果只包括小數(shù)部分,則將該小數(shù)部分做為R的數(shù)值予以保存,將O做為G、B的數(shù)值予以保存,并結(jié)束。
[0043]其中,S4具體為:
[0044]如果所述場景深度值介于所述霧正面深度值與所述霧背面深度值之間,則按照如下公式進(jìn)行計(jì)算:霧所占距離=場景深度值-霧正面深度值;
[0045]如果所述場景深度值大于所述霧背面深度值,則按照如下公式進(jìn)行計(jì)算:霧所占距離=霧背面深度值-霧正面深度值;
[0046]否則,霧所占距離等于O。
[0047]優(yōu)選地,S6按照如下公式計(jì)算混合后的顏色值:
[0048]Color = sceneColor* (1-Disfactor)+fogColor*Disfactor
[0049]式中,
[0050]Color,混合后的顏色值;
[0051]sceneColor,模型紋理顏色值;
[0052]Disfactor,混合因子;
[0053]fogColor,霧顏色值。
[0054]進(jìn)一步地,S5和S6之間還包括步驟,獲取模型紋理顏色值和霧顏色值。
[0055]優(yōu)選地,所述模型的顏色根據(jù)如下方法獲取:利用HLSL內(nèi)置函數(shù)tex2D(s,t)獲取模型的紋理信息,所述紋理信息包括采樣器和紋理坐標(biāo),根據(jù)所述采樣器和所述紋理坐標(biāo),獲取所述模型紋理顏色值。
[0056]本發(fā)明的有益效果是:本發(fā)明實(shí)施例提供的實(shí)時(shí)體積霧化效果算法,基于Z軸深度霧化,從觀察點(diǎn)到頂點(diǎn)的有效距離計(jì)算,得到的霧化效果會(huì)隨著兩點(diǎn)間距離的增大而增加,符合真實(shí)的云霧、水汽或灰塵存在的場景,因此,在利用3D圖形引擎進(jìn)行渲染時(shí),能夠更好的表現(xiàn)復(fù)雜的霧化效果,而無需再構(gòu)建其他公式或算法,且場景霧化效果更真實(shí),更具有沉浸感和縱深感;同時(shí),本發(fā)明實(shí)施例中,使用HLSL極大的提高了 3D程序設(shè)計(jì)的靈活性,實(shí)現(xiàn)了許多固定功能流水線所不能實(shí)現(xiàn)的功能,從而可以提高該算法在圖形系統(tǒng)中的應(yīng)用率。
【附圖說明】
[0057]圖1是本發(fā)明實(shí)施例提供的實(shí)時(shí)體積霧化效果算法流程示意圖。
【具體實(shí)施方式】
[0058]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的【具體實(shí)施方式】僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0059]如圖1所示,本發(fā)明實(shí)施例提供了一種實(shí)時(shí)體積霧化效果算法,包括如下步驟:
[0060]SI,從Z-Buffer與Frame-Buffer中,獲取每個(gè)像素點(diǎn)的深度信息,所述深度信息包括場景深度信息、霧正面深度信息和霧背面深度信息;
[0061]S2,將所述深度信息保存到深度紋理圖片上,具體包括:將所述場景深度信息保存到場景深度紋理圖片上;將所述霧正面深度信息保存到霧正面深度紋理圖片上;將所述霧背面深度