李京娓
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
延遲貼花技術(shù)
李京娓
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
貼花渲染是一種用來(lái)向3D場(chǎng)景中添加額外的細(xì)節(jié)并且保持原場(chǎng)景不變的常用方法[1]。該技術(shù)目前主要應(yīng)用在3D游戲中以實(shí)現(xiàn)一些視覺(jué)特效。如射擊類游戲中的子彈痕跡、場(chǎng)景中的爆炸痕跡等。貼花一般并非原始場(chǎng)景的一部分,而是在游戲過(guò)程中動(dòng)態(tài)產(chǎn)生的。通常情況下,這些效果都是通過(guò)創(chuàng)造一個(gè)新的貼花對(duì)象來(lái)實(shí)現(xiàn)的。
傳統(tǒng)的貼花渲染方法中存在一些缺陷,難以滿足對(duì)圖像真實(shí)感日益增高的要求。延遲貼花技術(shù)基于延遲渲染管線對(duì)現(xiàn)有的紋理投影技術(shù)進(jìn)行擴(kuò)展。該技術(shù)實(shí)現(xiàn)更加簡(jiǎn)便,并且可以較好地提高貼花渲染的效果,使其在多數(shù)情況下看起來(lái)更加真實(shí)。同時(shí),延遲貼花技術(shù)允許更加靈活的使用貼花,不必像基于前向渲染的傳統(tǒng)貼花方法那樣局限于使用漫反射紋理貼花。
傳統(tǒng)貼花渲染方法基于前向渲染管線實(shí)現(xiàn),其通常采用的方案是:緊貼著現(xiàn)有的幾何體表面渲染貼花多邊形,再通過(guò)使用某種方法,將被貼花覆蓋的場(chǎng)景表面的像素顏色與貼花的顏色進(jìn)行融合。雖然,在通常情況下,傳統(tǒng)方法一般具有不錯(cuò)的渲染效果。但是,不可否認(rèn),它仍存在如光照不一致、深度沖突、貼花紋理變形等諸多缺陷[2]。在游戲引擎中,對(duì)使用傳統(tǒng)方法的貼花系統(tǒng)的實(shí)現(xiàn)與支持是非常昂貴的,同時(shí)也是十分困難的。
就基本原理而言,傳統(tǒng)貼花渲染方法可以分為兩類:使用紋理投影實(shí)現(xiàn)和使用網(wǎng)格投影實(shí)現(xiàn)。
紋理投影技術(shù)出現(xiàn)較早,其基本思路非常簡(jiǎn)單:對(duì)場(chǎng)景進(jìn)行兩遍渲染。使用紋理投影技術(shù)渲染貼花的基本實(shí)現(xiàn)過(guò)程如下:首先,渲染場(chǎng)景并獲取場(chǎng)景信息;然后,使用投影的紋理進(jìn)行渲染;最后,使用某種方法將兩遍渲染的結(jié)果進(jìn)行融合。
當(dāng)場(chǎng)景較為簡(jiǎn)單且貼花數(shù)量較少時(shí),紋理投影具有較好的性能。但是,當(dāng)場(chǎng)景比較復(fù)雜且需要渲染大量的貼花時(shí),這種方法性能很差[3-4]。
網(wǎng)格投影技術(shù)的基本思路主要是:首先將貼花處理為能夠附著到場(chǎng)景幾何體表面的幾何網(wǎng)格,然后把得到的幾何網(wǎng)格當(dāng)做多邊形列表進(jìn)行渲染[5-6]。
就目前的資料來(lái)說(shuō),對(duì)網(wǎng)格投影這一方法的使用要比紋理投影更普遍些。例如,在早期的Source Engine中,應(yīng)該就是使用的這一方法渲染貼花;Wolfire開(kāi)發(fā)的Overgrowth中也使用到這一技術(shù)。
在網(wǎng)格投影中所得到的幾何網(wǎng)格,實(shí)際就是一些三角形。這些三角形就是一些普通的幾何圖形,因而即使在場(chǎng)景中大量使用這種貼花,也不會(huì)影響其渲染性能。使用網(wǎng)格投影技術(shù)的關(guān)鍵在于三角形分割,因此該方法對(duì)生成三角形這一過(guò)程的算法要求較高,但這一過(guò)程的計(jì)算代價(jià),通常都是非常昂貴的。
延遲貼花技術(shù)是基于延遲渲染管線實(shí)現(xiàn)的,并使用貼花幾何體代替?zhèn)鹘y(tǒng)方法中渲染的貼花多邊形[7-8]。其具體實(shí)現(xiàn)主要分為三步:渲染 G-buffer(Geometry Buffer,幾何緩沖區(qū)),渲染貼花幾何體,后處理過(guò)程。
這一步主要是將場(chǎng)景的幾何信息存儲(chǔ)在中間緩沖區(qū)G-buffer中,為之后的逐像素渲染做準(zhǔn)備。由于在deferred階段只渲染離屏幕最近的那個(gè)像素,因而在延遲渲染管線中無(wú)法處理透明或半透明物體。因此延遲貼花在建立G-buffer時(shí),需要使用額外的通道存儲(chǔ)透明度。具體操作如下:在建立G-Buffer時(shí)將透明物體與背景逐像素交織,并將透明度存放在一個(gè)單獨(dú)的通道中,然后與通常情況一樣地進(jìn)行光照計(jì)算,然后再根據(jù)透明度將透明物體與背景逐像素混合。
成功地建立G-buffer后,可以得到之后計(jì)算時(shí)所需的一些信息:場(chǎng)景的法線與深度。本文在這里使用了一個(gè)名為normal_depth buffer的中間緩沖區(qū)存儲(chǔ)這些信息。
本文使用特殊的著色器對(duì)貼花的包圍幾何體進(jìn)行渲染,以此取代傳統(tǒng)方法中緊貼著場(chǎng)景幾何體表面渲染貼花多邊形的過(guò)程。
(1)貼花包圍幾何體
這里所說(shuō)的貼花包圍幾何體,可以看作一種近似碰撞檢測(cè)物體。使用貼花包圍幾何體的目的是為了標(biāo)記被貼花影響到的場(chǎng)景表面。
在傳統(tǒng)方法中通常選擇緊貼著場(chǎng)景表面繪制一個(gè)與貼花尺寸相同、位置一致的四邊形。但是,在延遲貼花技術(shù)中,為了得到更好的渲染效果,一般選擇渲染貼花的一個(gè)包圍幾何體。使用貼花的包圍幾何體,允許從任意方向觀察到貼花的效果,并且能夠?qū)崿F(xiàn)貼花角落環(huán)繞。
如果不計(jì)開(kāi)銷的話,貼花的包圍幾何體何以使用任意形狀,一般選擇球或者立方體。使用貼花包圍球與使用貼花立方體時(shí)最主要的不同之處在于:如何將片段的屏幕坐標(biāo)變換為貼花空間坐標(biāo)。其實(shí),使用貼花包圍球要更容易些。因?yàn)?,使用包圍球時(shí)可以直接將片段的世界坐標(biāo)變換到局部球體坐標(biāo),再根據(jù)對(duì)應(yīng)的體積貼花或二維紋理進(jìn)行一次映射,然后訪問(wèn)紋理即可,并不需要用到貼花變換矩陣。本文選擇立方體作為貼花的包圍幾何體,如圖1所示。
圖1 貼花的包圍立方體
(2)貼花變換矩陣
渲染貼花時(shí),自然就需要在貼花空間中工作。為了達(dá)到這一目的,便需要得到貼花局部坐標(biāo)系的一個(gè)變換矩陣。本文使用貼花的位置及朝向信息重建貼花局部坐標(biāo)系,從而計(jì)算出一個(gè)貼花變換矩陣。
算法1展示了貼花局部坐標(biāo)系的具體構(gòu)造方法,這與構(gòu)造切線空間時(shí)使用的方法是一致的。其中DTM (Decal Transformation Matrix,貼花變換矩陣)為所求變換矩陣的最終形式。
算法1:重建貼花局部坐標(biāo)系及貼花變換矩陣
(3)頂點(diǎn)著色器
在頂點(diǎn)著色器中通過(guò)使用貼花的尺寸與之前得到的貼花變換矩將渲染的單位貼花立方體縮放至貼花的大小,并在世界空間定位縮放后的貼花立方體。
算法2對(duì)這一過(guò)程進(jìn)行了描述:首先使用貼花的尺寸對(duì)單位立方體進(jìn)行縮放,使其與實(shí)際渲染的貼花大小一致,然后將縮放后的貼花立方體變換到世界坐標(biāo)系中。
算法2:縮放單位立方體并在世界空間定位
(4)片段著色器
在片段著色器中,主要進(jìn)行了一些坐標(biāo)系間的變換:首先,從之前渲染G-buffer得到的normal_depth buffer中,獲取所渲染的片段的深度信息,并利用其構(gòu)造當(dāng)前片段的三維坐標(biāo);隨后,將屏幕坐標(biāo)轉(zhuǎn)換為世界坐標(biāo),使用貼花變換矩陣的逆矩陣將世界坐標(biāo)轉(zhuǎn)換為貼花空間坐標(biāo);最后對(duì)貼花坐標(biāo)進(jìn)行變換從而得到紋理坐標(biāo),并將其用于之后的紋理查找。算法3描述了這一過(guò)程。
算法3:片段著色器中的坐標(biāo)變換
在后處理過(guò)程中的進(jìn)行的基本操作是:將貼花沿著貼花空間的高度軸(即通常情況下的Z軸)投影到其下方的場(chǎng)景幾何體的表面。由于該基本操作僅使用了貼花坐標(biāo)中的橫、縱坐標(biāo) (即通常情況下坐標(biāo)中的x、y),所以貼花沿貼花空間高度軸的投影是無(wú)限的,這便導(dǎo)致延遲貼花渲染在某些場(chǎng)景下會(huì)出現(xiàn)拖尾效應(yīng)。因此需要在后處理過(guò)程中添加其他操作以解決這一問(wèn)題,獲得更好的渲染效果??梢酝ㄟ^(guò)設(shè)置淡出參數(shù)或者貼花角落環(huán)繞解決這一問(wèn)題。
使用淡出方法解決拖尾效應(yīng)的基本思路是:用貼花的尺寸來(lái)縮放片段與貼花平面間的距離,并將縮放結(jié)果作為淡出參數(shù),對(duì)紋理采樣的結(jié)果進(jìn)行修正。只有在貼花是平面的并且場(chǎng)景表面較為平坦時(shí),淡出才有較好的效果。并且求取淡出參數(shù)沒(méi)有固定的公式,因?yàn)榍笕≡搮?shù)的式子可能會(huì)因貼花的改變而改變。
通過(guò)使貼花角落環(huán)繞,可以使其適應(yīng)較為復(fù)雜的場(chǎng)景表面曲率。算法4展示了使貼花角落環(huán)繞解決拖尾效應(yīng)的具體過(guò)程:首先,由normal_depth buffer中獲取當(dāng)前渲染片段對(duì)應(yīng)的表面法線;然后,將表面法線變換至貼花空間,這時(shí)其x、y的值便構(gòu)成了表面相對(duì)于貼花平面的梯度;最后,計(jì)算紋理坐標(biāo),并使用獲得的梯度對(duì)紋理坐標(biāo)進(jìn)行修正,用修正后的坐標(biāo)進(jìn)行紋理查找。
算法4:使貼花角落環(huán)繞
圖2中展示了通過(guò)設(shè)置淡出參數(shù)和使貼花角落環(huán)繞修正拖尾效應(yīng)前后的效果,通過(guò)對(duì)比可以得出以下結(jié)論:在具有較大斜率的表面上渲染貼花時(shí),使貼花角落環(huán)繞與淡出相比,能夠更加可靠地解決拖尾效應(yīng)。
圖2 使用淡出參數(shù)與使貼花角落環(huán)繞的修正效果
圖3分別展示了傳統(tǒng)貼花渲染與延遲貼花渲染的效果。實(shí)驗(yàn)可知,使用傳統(tǒng)方法進(jìn)行貼花渲染時(shí),由于光照不一致、深度沖突等原因,會(huì)造成貼花閃爍。而延遲貼花技術(shù)相對(duì)于傳統(tǒng)貼花渲染具有更好的渲染效果。這是因?yàn)椋舆t貼花技術(shù)是基于延遲渲染管線實(shí)現(xiàn)的,因此能夠很好地解決光照一致性問(wèn)題。同時(shí)延遲貼花也是紋理投影技術(shù)的一種擴(kuò)展,具有紋理投影的特點(diǎn),完美地消除了深度沖突問(wèn)題。此外由于使用立方體作為貼花幾何,我們能夠從任意角度觀察到貼花。
圖3 傳統(tǒng)貼花渲染(上)與延遲貼花渲染(下)的渲染效果
圖4展示了向凹凸的場(chǎng)景表面渲染含有法線紋理的貼花,并通過(guò)改變貼花的透明度模擬隨時(shí)間變化的侵蝕效果。場(chǎng)景的漫反射顏色紋理與法線紋理以及貼花的漫反射顏色紋理與法線紋理如圖5所示。
該實(shí)驗(yàn)結(jié)果能夠較好的體現(xiàn)出延遲貼花技術(shù)的一些優(yōu)點(diǎn)。使用延遲貼花技術(shù),允許更加靈活地使用貼花。因?yàn)樵谶M(jìn)行渲染計(jì)算之前貼花就已經(jīng)被添加到G-buffer中了,所以我們可以對(duì)貼花的法線、反射系數(shù)等任意屬性進(jìn)行更改,而不必像傳統(tǒng)方法那樣局限于對(duì)漫反射顏色進(jìn)行處理,并且這些更改也不會(huì)增加系統(tǒng)開(kāi)銷。由于貼花紋理帶有alpha通道,延遲貼花還能夠?qū)ν该骰虬胪该鞯馁N花進(jìn)行處理。因此,可以通過(guò)改變貼花的透明度來(lái)模擬隨時(shí)間變化的侵蝕等效果。
圖4 改變貼花的alpha值模擬侵蝕效果
圖5 場(chǎng)景與貼花的顏色及法線紋理
延遲貼花技術(shù)基于延遲渲染管線對(duì)現(xiàn)有的紋理投影技術(shù)進(jìn)行擴(kuò)展。該技術(shù)完全基于GPU實(shí)現(xiàn),繼承了延遲渲染在光照處理方面的所有優(yōu)勢(shì),無(wú)需進(jìn)行額外的光照計(jì)算,開(kāi)銷較低。另外,由于延遲貼花技術(shù)渲染了貼花的包圍幾何體,因此能夠從任意角度觀察到貼花的作用效果。實(shí)驗(yàn)證明,該技術(shù)實(shí)現(xiàn)較簡(jiǎn)單,并且相對(duì)于傳統(tǒng)貼花渲染技術(shù)可以更加靈活地使用貼花,同時(shí)能夠較好地提高貼花渲染的效果,使其在多數(shù)情況下看起來(lái)更加真實(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-),女,山東,碩士研究生,研究方向?yàn)樾畔⑻幚砑夹g(shù)、計(jì)算機(jī)圖形學(xué)
2015-11-24
2015-12-24
隨著延遲渲染技術(shù)的廣泛應(yīng)用,基于延遲渲染管線實(shí)現(xiàn)的貼花渲染方法也在近幾年流行開(kāi)來(lái)。延遲貼花技術(shù)對(duì)現(xiàn)有的紋理投影技術(shù)進(jìn)行擴(kuò)展,完全基于GPU實(shí)現(xiàn)。延遲貼花技術(shù)因?qū)崿F(xiàn)較簡(jiǎn)單并且性能良好,而成為目前極為流行的一種貼花渲染技術(shù),被廣泛應(yīng)用于游戲中實(shí)現(xiàn)一些視覺(jué)特效。結(jié)合OpenGL基于GPU實(shí)現(xiàn)延遲貼花,并展示部分實(shí)驗(yàn)結(jié)果。
貼花;延遲渲染;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.