收稿日期:2007-11-20;修回日期:2008-01-17
基金項目:國家“863”計劃資助項目(2006AA01Z335)
作者簡介:黃藍梟(1982-),男,碩士,主要研究方向為網絡游戲引擎技術、真實感渲染技術、物理學動畫(lanxiaohuang@yahoo.com.cn);盧光輝(1971-),男,副教授,博士,主要研究方向為數字圖像處理、三維圖形技術、網格計算等;何明耘(1972-),男,講師,博士,主要研究方向為3D網絡游戲引擎、數字圖像處理、三維圖形技術;蔡洪斌(1966-),男,副教授,博士,主要研究方向為3D網絡游戲引擎、網絡計算技術、數據庫技術及應用、網格計算及其應用*
(電子科技大學 數字媒體技術研究所,成都 610054)
摘 要:在研究透鏡成像模型與針孔成像模型的基礎上,在計算機三維場景成像中實時地模擬出景深效果。算法利用了MRT(multiple render targets)技術及GPU的可編程性,在渲染時將場景存為紋理,并輸出了像素的深度值和模糊因子,利用模糊因子計算每像素模糊圈大小并對圖像進行濾波,最終在模糊圈內對清晰圖像和模糊圖像進行融合,模擬出景深效果。以一個場景的景深模擬為例,展示了不同聚焦時的景深效果。
關鍵詞:景深; 虛擬現實; 實時性; 可編程圖形硬件
中圖分類號:TP391
文獻標志碼:A
文章編號:1001-3695(2008)10-3045-03
Real-time depth-of-field simulation on GPU
HUANG Lan-xiao, LU Guang-hui, HE Ming-yun, CAI Hong-bin
(Digital Media Technology Laboratory, University of Electronic Science Technology of China, Chengdu 610054, China)
Abstract:This paper proposed an efficient and real-time algorithm for the simulation of camera imaging in the three-dimensional scene based on both ideal and real camera models. The algorithm took extensive use of the multiple render targets(MRT) technology and graphics processing unit(GPU) for programmable performance. It outputed the image of the three-dimensional scene and stored as a texture, and also outputed each pixel’s depth and blurriness information and also stored as texture. At last, filtered the image, calculated the size of confusion(CoC) for each pixel by the blurriness, and used CoC to blend between the original(clear) image and blurred image. Our experiments on simulation of depth-of-field in a geome-try scene demonstrate various effects with different parameters.
Key words:depth-of-field(DoF); virtual reality; real-time; GPU
0 引言
景深是人眼視覺系統中成像的重要特征。人眼對現實世界成像時,自動調節焦距以適應不同的取景距離,眼睛注視的物體便處于聚焦平面(focus plane)上,因此清晰成像于視網膜;而處于聚焦平面之外的物體,成像便模糊不清。透鏡(瞳孔)的焦距、直徑,以及物距共同決定了物體成像時的模糊程度。然而,目前的虛擬現實系統中,幾乎都未引入景深效果,整個場景成像后都是清晰的,這樣,整個場景則顯得不夠真實、自然,并且缺少景深所帶的深度暗示[1]。加入景深效果,有助于立體照片的合成以及緩解虛擬現實系統中常有的眼睛疲勞,增強場景的真實感、沉浸感。
近年來,在計算機圖形學領域中出現了許多關于景深渲染的算法研究,這些算法主要歸為以下三類:
a)后處理濾波。Potmesil等人[2,3]是后處理濾波的代表,也是最早研究景深算法的學者。其算法采用標準針孔相機模型渲染場景,并輸出每個像素的深度值z;根據深度值z、光圈、焦距等將每個采樣點轉換為不同大小、強度分布的模糊圈(CoC);每個像素的最終值由覆蓋它的所有模糊圈的加權平均值確定。Potmesil采用了Lommel強度分布函數計算點對周圍像素的影響。Chen[4]也采用了類似的方法來計算強度分布。周強等人[5]采用了均值濾波得到模糊圖像,再與清晰圖像融合,實時地模擬了景深效果。
Potmesil和Chen的算法都是采用軟件實現,運算全由CPU負擔,運行時間較長,難以滿足虛擬現實等高實時性的要求。Rokita[6,7]提出使用特殊的數字硬件濾波器以加速DoF效果的產生。它采用多次高斯卷積濾波將像素值融合到周圍像素中,達到模糊的效果。由于采用了卷積濾波技術,引起像素的強度滲漏,引起前后景物體混合模糊、聚焦面上的物體與前景或后景的模糊物體混合模糊等。周強等人[5]的算法雖滿足實時性,但均值濾波會引起強度滲漏,且融合時未考慮模糊圈內的像素,精度不高。
b)多次渲染。其采用針孔相機模型,通過每次細微地改變投影中心,并保持聚焦面不變[8],然后將渲染結果累積保存,最終便得到一幅具有景深效果的圖像[9]。但是,多次渲染所得的景深效果重影較重,缺乏真實感。
c)反向光線跟蹤。Kolb 等人[10]的幾何透鏡模型和Cook 等人[11]的分布式光線跟蹤采用對每個像素反向跟蹤若干條光線,取這些光線顏色的加權和作為像素顏色,成功地模擬了聚焦、景深等效果。這樣圖像上的點是多束光線疊加的效果,避免了針孔相機模型中一對一映射而無景深效果的缺陷。但此類算法繪制速度很慢,且當透鏡參數改變時,需重新計算[12]。吳向陽等人[12]采用基于正向光線跟蹤模擬底片的成像機制,生成了真實的攝像效果,并且當透鏡參數改變時無須重新求取光線與場景的交和光亮度,但算法僅限于幾何場景,并采用真實透鏡模型,因此,速度難以滿足虛擬現實系統的要求。
目前,很多算法需要大量的計算或缺乏精度而不能應用于虛擬現實系統。本文所采用的景深算法充分利用了目前GPU(圖形處理器)的并行性和可編程能力,將大量代數運算從CPU轉移至GPU,不僅釋放了CPU,并且減少了CPU與GPU的通信量,大大提高了景深模擬的速度,適用于大規模復雜場景;同時,根據薄透鏡系統成像時產生模糊的原理(根據式(2)求得的模糊圈進行融合),提高了景深模擬的精確度。
1 景深原理
三維計算機圖形系統模型采用的是針孔照相機模型,如圖1所示。理想針孔照相機的小孔很小,從點光源發出的光只有一條光線能進入小孔,是點對點的線性映射關系,因此理想針孔照相機的景深是無窮遠,在視域范圍內任何點都在聚焦范圍之內[13]。
人眼視覺系統可用圖2所示的薄透鏡模型表示,此模型也被廣泛使用[1,7]。從物點O發散出進入透鏡的光線被折射成像于像點I。透鏡焦距f、物距u 、相距v間關系構成透鏡方程(1):1/f=1/u+1/v(1)
透鏡對光線的折射取決于它的焦距f,人眼通過調節自身的焦距f以讓目光所注視的物體(聚焦面上的物體)在視網膜(成像面)上成像清晰。然而,在聚焦面兩側的物體上的一點其在視網膜上的成像則不止一個點,是一個模糊圈,如圖3所示。聚焦面外的物點O通過人眼晶體折射后在視網膜的成像為一個直徑為3的模糊圈。模糊圈的直徑Cr用式(2)[1]計算:Cr=|Vd-Vf|(D-Vd)(2)
Vd=P×d/(d-P)
d>P
Vf=P×df/(df-P)
df>P其中:D=透鏡直徑;d=物體到透鏡的距離;df=聚焦面到透鏡的距離;P=1/(1/df+1/dr)=f;dr = 視網膜到透鏡的距離。2 基于可編程GPU的DoF算法
一幅具有景深的圖,在其聚焦面上的成像是清晰可見的,而在聚焦面兩側的成像是模糊的,其模糊程度和模糊圈成正比關系。因此,可利用清晰和模糊場景紋理的融合(blend)來模擬景深效果,融合因子采用歸一化的模糊圈大小。下面為算法的具體實現流程。
21 利用頂點編程以及像素編程獲得深度信息和模糊信息
在虛擬現實系統(VR)中,光圈、焦距及透鏡參數可以隨意調節,因此物體各點的模糊程度需要實時計算式(1)。同時,為了防止前景像素流入后景,在保存場景物體各點的模糊程度之外,還需要保存場景各點的深度信息,因此,可采用多渲染目標(multiple render target),將場景輸出到一張紋理,深度信息和模糊信息歸一化后輸出到另一張紋理(圖4)。
在視圖空間中,設物體上點的坐標為pos(x, y, z),近剪截平面為znear,遠剪截平面為zfar,則物點的深度值為z,歸一化輸出為depth=z/zfar;根據式(1),可計算得出近剪截面的模糊圈直徑為Cnear,遠剪截面的模糊圈直徑為Cfar,取它們的最大值作為maxCoC,即maxCoC=max(Cnear, Cfar)(3)
物體上點的模糊圈大小可由式(2)得到,歸一化后模糊因子為blurriness=|f×z/(z-f)-f×df/(df-f)|×
(D-f×z/(z-f))/max(Cnear, Cfar)(4)22 圖像預模糊
處于聚焦平面外的物體上的點經過透鏡折射后,在成像面上形成一個模糊圈,在屏幕上則表現為多個像素組成的圓形區域。它是像素與周圍多個像素相互作用的結果。在針孔照相機模型中,可以采用平滑濾波處理得到。在圖像處理中,常用的平滑算子有高斯濾波、均值濾波等。為了取得更好的效果,這里采用可分離2D高斯濾波。F=(∑ni=1∑nj=1Pij×Cij)/S(5)其中:F表示目標像素濾波后的值;Pij表示2D高斯矩陣中的像素;C表示像素Pij對應的高斯系數;n表示矩陣的維數;S表示高斯矩陣中所有系數的和。
在高斯濾波的規模確定時,可采用標準卷積的計算方法來計算高斯濾波,因此計算分解為兩部分,即沿x方向的計算1D卷積;再在此基礎上沿y方向計算1D卷積。高斯濾波如圖5所示。
23 模擬模糊圈、融合清晰和模糊的圖像
經過2.1和2.2節兩個處理后,得到了一幅清晰的圖像和一幅模糊的圖像,可以直接融合這兩幅圖得到具有景深效果的場景圖,如下:color=a×blurImage+(1-a)× originalImage(6)其中:a為blurriness,由式(4)求得。
為了達到更好的景深效果,在融合每個像素前,應根據此像素對應的模糊因子(blurriness)確定一個CoC大小。在模糊圈范圍內取1個中心點以及按照泊松圓盤分布(Poisson disk distribution)隨機地取12個像素進行采樣(pixel shader2.0中,一個pass最低支持13個采樣器)。
模糊圈的大小是根據模糊圈的中心采樣點的模糊因子(blurriness)以及maxCoC計算的,如下:radius=blurriness×maxCoC/2(7)
圖6左邊的模糊因子等于0,說明該點處于聚焦面上,由式(7)計算得模糊半徑為0,此點成像清晰;右邊的模糊因子等于1,由式(7)計算得模糊半徑為maxCoC/2,此點成像模糊。根據模糊采樣圈中的13個采樣點,逐個對原始的清晰圖像和模糊后的圖像分別采樣,得到colorOriginal、colorBlur;再根據原始圖像中此像素對應的模糊因子進行融合,如式(8);最后,求13個采樣點融合后的幾何平均數就得到了最終此像素點的顏色值。color=lerp(colorOriginal, colorBlur, blurriness)(8)
在求采樣點的幾何平均時,如果將所有融合后的顏色值求算術平均,會導致前景物體的顏色流入到后景中。所以,在2.1節的處理中,保留了每個像素對應的深度值,在對模糊圈求平均時,將每個采樣點的深度值與中心點(center point)的深度值作比較。如果此點深度值小于中心點的深度值,則將其濾去,但這樣會引起poping效果,即前景與后景的變換很突然,缺乏一種柔和過渡的效果。為了解決poping,對前景物體上的點,采用它的模糊因子作為其權值與其他點相加,就可達到既無前景流入后景的問題,又無poping問題。算法代碼描述如下(HLSL):
......
/****變量說明
texCoord:中心采樣點的紋理坐標
tSource:2.1節得到的存儲原始場景的紋理
tBlurred:2.2節得到的存儲模糊場景的紋理
depthBlurSample:2.1節得到的存儲對應于原始場景中每個像素的深度和模糊值的紋理
pixelSize:像素的大小
poisson[]:存儲泊松分布的數組
radius:CoC的半徑
****/
//定義最終(輸出)顏色值
float4 colorOut = float4( 0, 0, 0, 0 );
//取得中心點的深度值centerDepth
float4 centerColor= tex2D(depthBlurSample,texCoord );
float centerDepth = centerColor.x;
//對13個采樣點循環處理
for( int i=0; i<=13; i++ ){
//計算每一個采樣點的紋理坐標
float2 coord = texCoord + pixelSize*poisson[i]*radius;
//取得原始顏色值
float4 colorOriginal = tex2D( tSource, coord );
//取得模糊顏色值
float4 colorBlurred = tex2D( tBlurred, coord );
//取得深度和模糊值
float4 depthBlur = tex2D( depthBlurSample, coord);
//根據深度值對原始和模糊紋理進行融合
float4 color = lerp( colorOriginal, colorBlurred, depthBlur.y );
float blur;
//處理前景點
blur = ( centerDepth <= depthBlur.x ) ? 1 : depthBlur.y ;
cout.rgb += color.rgb * blur;
cout.a += blur;
}
cout = cout / cout.a ;
......
3 模擬效果實例
圖7為三幅算法實現的效果圖,圓圈內的為處在聚焦面上的點,其成像清晰;其他部分根據所處的深度不同而模糊程序不同,并無出現后景(墻)的顏色流入分機邊緣的現象。
4結束語
在本機配置(CPU P4 3.2 GHz,1 GB內存,GPU GeForce7600 GT,256 MB顯存)環境下,采用本算法仿真在分辨率為1 280×1 024時的幀速率可達70 fps,滿足實時性的要求,對聚焦面和非聚焦面的成像逼真,焦距、光圈都可以連續調節,可應用于VR系統中。
本文所采用的算法能夠很好地實時模擬出景深效果,但在融合模糊與清晰圖像時,精度還有待提高,也是今后研究的重點。
參考文獻:
[1]MULDE J D. LIERE R van. Fast perception-based depth of field rendering[C]//Proc of ACM VRST. Seoul: [s.n.], 2000: 129-133.
[2]POTMESIL M, CHAKRAVARTY I. A lens and aperture camera model for synthetic image generation[J]. Computer Graphics, 1981,15(3): 297-305.
[3]POTMESIL M, CHAKRAVARTY I. Synthetic image generation with a lens and aperture camera model[J]. ACM Trans on Graphics,1982,1(2):85-108.
[4]CHEN Y C. Lens effect on synthetic image generation based on light particle theory[J]. The Visual Computer,1987,3(3):125-136.
[5]周強, 彭俊毅, 戴樹嶺. 基于可編程圖形處理器的實時景深模擬[J]. 系統仿真學報, 2006,18(8):2219-2221,2238.
[6]ROKITA P. Fast generation of depth of field effects in computer graphics[J]. Computer and Graphics,1993,17(5):593-595.
[7]ROKITA P. Generating depth-of-field effects in virtual reality applications[J]. IEEE Computer Graphics and Applications, 1996,16(2):18-21.
[8]NEIDER J, DAVIS T, WOO M. OpenGL programming guide: the official guide to learning OpenGL[M]. Massachusetts: Addison-Wesley, 1993.
[9]HAEBERLI P, AKELEY K. The accumulation buffer: hardware support for high-quality rendering[J]. Computer Graphics, 1990,24(4): 309-318.
[10]KOLB C, MITCHELL D,PAT H. A realistic camera model for computer graphics[C]//Proc of ACM SIGGRAPH’95. 1995: 317-324.
[11]COOK R L, PORTER T, CARPENTERL. Distributed ray tracing[J]. Computer Graphics,1984,18(3):137-145.
[12]吳向陽, 鮑虎軍, 陳為,等. 采用正向光線跟蹤的照相機成像實時模擬[J]. 計算機輔助設計與圖形學學報,2005,17(7):1427-1433.
[13]ANGEL E. Interactive computer graphics:a top-down approach with OpenGL[M]. 3rd ed. Pearson: Addison-Wesley, 2002: 11-12.