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