李京娓
(四川大學計算機學院,成都 610065)
延遲貼花技術
李京娓
(四川大學計算機學院,成都610065)
貼花渲染是一種用來向3D場景中添加額外的細節(jié)并且保持原場景不變的常用方法[1]。該技術目前主要應用在3D游戲中以實現(xiàn)一些視覺特效。如射擊類游戲中的子彈痕跡、場景中的爆炸痕跡等。貼花一般并非原始場景的一部分,而是在游戲過程中動態(tài)產生的。通常情況下,這些效果都是通過創(chuàng)造一個新的貼花對象來實現(xiàn)的。
傳統(tǒng)的貼花渲染方法中存在一些缺陷,難以滿足對圖像真實感日益增高的要求。延遲貼花技術基于延遲渲染管線對現(xiàn)有的紋理投影技術進行擴展。該技術實現(xiàn)更加簡便,并且可以較好地提高貼花渲染的效果,使其在多數(shù)情況下看起來更加真實。同時,延遲貼花技術允許更加靈活的使用貼花,不必像基于前向渲染的傳統(tǒng)貼花方法那樣局限于使用漫反射紋理貼花。
傳統(tǒng)貼花渲染方法基于前向渲染管線實現(xiàn),其通常采用的方案是:緊貼著現(xiàn)有的幾何體表面渲染貼花多邊形,再通過使用某種方法,將被貼花覆蓋的場景表面的像素顏色與貼花的顏色進行融合。雖然,在通常情況下,傳統(tǒng)方法一般具有不錯的渲染效果。但是,不可否認,它仍存在如光照不一致、深度沖突、貼花紋理變形等諸多缺陷[2]。在游戲引擎中,對使用傳統(tǒng)方法的貼花系統(tǒng)的實現(xiàn)與支持是非常昂貴的,同時也是十分困難的。
就基本原理而言,傳統(tǒng)貼花渲染方法可以分為兩類:使用紋理投影實現(xiàn)和使用網格投影實現(xiàn)。
紋理投影技術出現(xiàn)較早,其基本思路非常簡單:對場景進行兩遍渲染。使用紋理投影技術渲染貼花的基本實現(xiàn)過程如下:首先,渲染場景并獲取場景信息;然后,使用投影的紋理進行渲染;最后,使用某種方法將兩遍渲染的結果進行融合。
當場景較為簡單且貼花數(shù)量較少時,紋理投影具有較好的性能。但是,當場景比較復雜且需要渲染大量的貼花時,這種方法性能很差[3-4]。
網格投影技術的基本思路主要是:首先將貼花處理為能夠附著到場景幾何體表面的幾何網格,然后把得到的幾何網格當做多邊形列表進行渲染[5-6]。
就目前的資料來說,對網格投影這一方法的使用要比紋理投影更普遍些。例如,在早期的Source Engine中,應該就是使用的這一方法渲染貼花;Wolfire開發(fā)的Overgrowth中也使用到這一技術。
在網格投影中所得到的幾何網格,實際就是一些三角形。這些三角形就是一些普通的幾何圖形,因而即使在場景中大量使用這種貼花,也不會影響其渲染性能。使用網格投影技術的關鍵在于三角形分割,因此該方法對生成三角形這一過程的算法要求較高,但這一過程的計算代價,通常都是非常昂貴的。
延遲貼花技術是基于延遲渲染管線實現(xiàn)的,并使用貼花幾何體代替?zhèn)鹘y(tǒng)方法中渲染的貼花多邊形[7-8]。其具體實現(xiàn)主要分為三步:渲染 G-buffer(Geometry Buffer,幾何緩沖區(qū)),渲染貼花幾何體,后處理過程。
這一步主要是將場景的幾何信息存儲在中間緩沖區(qū)G-buffer中,為之后的逐像素渲染做準備。由于在deferred階段只渲染離屏幕最近的那個像素,因而在延遲渲染管線中無法處理透明或半透明物體。因此延遲貼花在建立G-buffer時,需要使用額外的通道存儲透明度。具體操作如下:在建立G-Buffer時將透明物體與背景逐像素交織,并將透明度存放在一個單獨的通道中,然后與通常情況一樣地進行光照計算,然后再根據(jù)透明度將透明物體與背景逐像素混合。
成功地建立G-buffer后,可以得到之后計算時所需的一些信息:場景的法線與深度。本文在這里使用了一個名為normal_depth buffer的中間緩沖區(qū)存儲這些信息。
本文使用特殊的著色器對貼花的包圍幾何體進行渲染,以此取代傳統(tǒng)方法中緊貼著場景幾何體表面渲染貼花多邊形的過程。
(1)貼花包圍幾何體
這里所說的貼花包圍幾何體,可以看作一種近似碰撞檢測物體。使用貼花包圍幾何體的目的是為了標記被貼花影響到的場景表面。
在傳統(tǒng)方法中通常選擇緊貼著場景表面繪制一個與貼花尺寸相同、位置一致的四邊形。但是,在延遲貼花技術中,為了得到更好的渲染效果,一般選擇渲染貼花的一個包圍幾何體。使用貼花的包圍幾何體,允許從任意方向觀察到貼花的效果,并且能夠實現(xiàn)貼花角落環(huán)繞。
如果不計開銷的話,貼花的包圍幾何體何以使用任意形狀,一般選擇球或者立方體。使用貼花包圍球與使用貼花立方體時最主要的不同之處在于:如何將片段的屏幕坐標變換為貼花空間坐標。其實,使用貼花包圍球要更容易些。因為,使用包圍球時可以直接將片段的世界坐標變換到局部球體坐標,再根據(jù)對應的體積貼花或二維紋理進行一次映射,然后訪問紋理即可,并不需要用到貼花變換矩陣。本文選擇立方體作為貼花的包圍幾何體,如圖1所示。
圖1 貼花的包圍立方體
(2)貼花變換矩陣
渲染貼花時,自然就需要在貼花空間中工作。為了達到這一目的,便需要得到貼花局部坐標系的一個變換矩陣。本文使用貼花的位置及朝向信息重建貼花局部坐標系,從而計算出一個貼花變換矩陣。
算法1展示了貼花局部坐標系的具體構造方法,這與構造切線空間時使用的方法是一致的。其中DTM (Decal Transformation Matrix,貼花變換矩陣)為所求變換矩陣的最終形式。
算法1:重建貼花局部坐標系及貼花變換矩陣
(3)頂點著色器
在頂點著色器中通過使用貼花的尺寸與之前得到的貼花變換矩將渲染的單位貼花立方體縮放至貼花的大小,并在世界空間定位縮放后的貼花立方體。
算法2對這一過程進行了描述:首先使用貼花的尺寸對單位立方體進行縮放,使其與實際渲染的貼花大小一致,然后將縮放后的貼花立方體變換到世界坐標系中。
算法2:縮放單位立方體并在世界空間定位
(4)片段著色器
在片段著色器中,主要進行了一些坐標系間的變換:首先,從之前渲染G-buffer得到的normal_depth buffer中,獲取所渲染的片段的深度信息,并利用其構造當前片段的三維坐標;隨后,將屏幕坐標轉換為世界坐標,使用貼花變換矩陣的逆矩陣將世界坐標轉換為貼花空間坐標;最后對貼花坐標進行變換從而得到紋理坐標,并將其用于之后的紋理查找。算法3描述了這一過程。
算法3:片段著色器中的坐標變換
在后處理過程中的進行的基本操作是:將貼花沿著貼花空間的高度軸(即通常情況下的Z軸)投影到其下方的場景幾何體的表面。由于該基本操作僅使用了貼花坐標中的橫、縱坐標 (即通常情況下坐標中的x、y),所以貼花沿貼花空間高度軸的投影是無限的,這便導致延遲貼花渲染在某些場景下會出現(xiàn)拖尾效應。因此需要在后處理過程中添加其他操作以解決這一問題,獲得更好的渲染效果??梢酝ㄟ^設置淡出參數(shù)或者貼花角落環(huán)繞解決這一問題。
使用淡出方法解決拖尾效應的基本思路是:用貼花的尺寸來縮放片段與貼花平面間的距離,并將縮放結果作為淡出參數(shù),對紋理采樣的結果進行修正。只有在貼花是平面的并且場景表面較為平坦時,淡出才有較好的效果。并且求取淡出參數(shù)沒有固定的公式,因為求取該參數(shù)的式子可能會因貼花的改變而改變。
通過使貼花角落環(huán)繞,可以使其適應較為復雜的場景表面曲率。算法4展示了使貼花角落環(huán)繞解決拖尾效應的具體過程:首先,由normal_depth buffer中獲取當前渲染片段對應的表面法線;然后,將表面法線變換至貼花空間,這時其x、y的值便構成了表面相對于貼花平面的梯度;最后,計算紋理坐標,并使用獲得的梯度對紋理坐標進行修正,用修正后的坐標進行紋理查找。
算法4:使貼花角落環(huán)繞
圖2中展示了通過設置淡出參數(shù)和使貼花角落環(huán)繞修正拖尾效應前后的效果,通過對比可以得出以下結論:在具有較大斜率的表面上渲染貼花時,使貼花角落環(huán)繞與淡出相比,能夠更加可靠地解決拖尾效應。
圖2 使用淡出參數(shù)與使貼花角落環(huán)繞的修正效果
圖3分別展示了傳統(tǒng)貼花渲染與延遲貼花渲染的效果。實驗可知,使用傳統(tǒng)方法進行貼花渲染時,由于光照不一致、深度沖突等原因,會造成貼花閃爍。而延遲貼花技術相對于傳統(tǒng)貼花渲染具有更好的渲染效果。這是因為,延遲貼花技術是基于延遲渲染管線實現(xiàn)的,因此能夠很好地解決光照一致性問題。同時延遲貼花也是紋理投影技術的一種擴展,具有紋理投影的特點,完美地消除了深度沖突問題。此外由于使用立方體作為貼花幾何,我們能夠從任意角度觀察到貼花。
圖3 傳統(tǒng)貼花渲染(上)與延遲貼花渲染(下)的渲染效果
圖4展示了向凹凸的場景表面渲染含有法線紋理的貼花,并通過改變貼花的透明度模擬隨時間變化的侵蝕效果。場景的漫反射顏色紋理與法線紋理以及貼花的漫反射顏色紋理與法線紋理如圖5所示。
該實驗結果能夠較好的體現(xiàn)出延遲貼花技術的一些優(yōu)點。使用延遲貼花技術,允許更加靈活地使用貼花。因為在進行渲染計算之前貼花就已經被添加到G-buffer中了,所以我們可以對貼花的法線、反射系數(shù)等任意屬性進行更改,而不必像傳統(tǒng)方法那樣局限于對漫反射顏色進行處理,并且這些更改也不會增加系統(tǒng)開銷。由于貼花紋理帶有alpha通道,延遲貼花還能夠對透明或半透明的貼花進行處理。因此,可以通過改變貼花的透明度來模擬隨時間變化的侵蝕等效果。
圖4 改變貼花的alpha值模擬侵蝕效果
圖5 場景與貼花的顏色及法線紋理
延遲貼花技術基于延遲渲染管線對現(xiàn)有的紋理投影技術進行擴展。該技術完全基于GPU實現(xiàn),繼承了延遲渲染在光照處理方面的所有優(yōu)勢,無需進行額外的光照計算,開銷較低。另外,由于延遲貼花技術渲染了貼花的包圍幾何體,因此能夠從任意角度觀察到貼花的作用效果。實驗證明,該技術實現(xiàn)較簡單,并且相對于傳統(tǒng)貼花渲染技術可以更加靈活地使用貼花,同時能夠較好地提高貼花渲染的效果,使其在多數(shù)情況下看起來更加真實。
[1]Krassnigg J.A Deferred Decal Rendering Technique[J].Game Engine Gems,Volume One,2010,1:271.
[2]Kim P.Screen Space Decals in Warhammer 40,000:Space Marine[C].ACM SIGGRAPH 2012 Posters.ACM,2012:6.
[3]Everitt C.Projective texture mapping[J].White paper,NVidia Corporation,2001,4.
[4]1 Kamburelis M.Shadow Maps and Projective Texturing in X3D[C].Proceedings of the 15th International Conference on Web 3D Technology.ACM,2010:17-26.
[5]Ohlarik D,Cozzi I P.A Screen-Space Approach to Rendering Polylines on Terrain[C].ACM SIGGRAPH 2011 Posters.ACM,2011:68.
[6]Qian G,Wang Y U E.Mesh Geometric Editing Approach Based on Gpu Texture[J].2012.
[7]Persson E.Volume Decals[J].GPU Pro,2011,2:115-120.
[8]Mans J,Andreev D.An Advanced Decal System[J].Game Programming Gems,2008,7:423-434.
Decal;Deferred Rendering;OpenGL;Texture Projection;Deferred Decal
Deferred Decal Rendering Technique
LI Jing-wei
(College of Computer Science,Sichuan University,Chengdu 610065)
1007-1423(2016)02-0076-05
10.3969/j.issn.1007-1423.2016.02.018
李京娓(1990-),女,山東,碩士研究生,研究方向為信息處理技術、計算機圖形學
2015-11-24
2015-12-24
隨著延遲渲染技術的廣泛應用,基于延遲渲染管線實現(xiàn)的貼花渲染方法也在近幾年流行開來。延遲貼花技術對現(xiàn)有的紋理投影技術進行擴展,完全基于GPU實現(xiàn)。延遲貼花技術因實現(xiàn)較簡單并且性能良好,而成為目前極為流行的一種貼花渲染技術,被廣泛應用于游戲中實現(xiàn)一些視覺特效。結合OpenGL基于GPU實現(xiàn)延遲貼花,并展示部分實驗結果。
貼花;延遲渲染;OpenGL;紋理投影;延遲貼花
With the development of deferred rendering technique,decal rendering techniques based on deferred rendering pipeline become popular. Deferred decal rendering technique is based on deferred rendering pipeline and extends existing texture projection technique.This technique is entirely GPU based.As deferred decal rendering technique is easy to realize and can improve the rendering effects,it's widely used in 3D games to realize visual effects.Realizes deferred decal rendering technique with OpenGL,demonstrates some results of experiments.