陳文倩
(四川大學(xué)計算機學(xué)院,成都610065)
計算機圖形學(xué)中的光柵圖形顯示器用離散量表示連續(xù)量,采樣的頻率不滿足Nyquist采樣定理引起的信息失真是渲染圖像出現(xiàn)走樣的主要原因,用于減少或消除走樣的技術(shù),被稱為反走樣技術(shù)[1]。圖形學(xué)中的走樣主要包括幾何走樣和著色走樣,這些走樣問題嚴(yán)重地影響了圖像的質(zhì)量,降低了渲染結(jié)果的真實感,這與人們所追求的高質(zhì)量高真實感的圖像相悖,所以反走樣技術(shù)一直是計算機圖形學(xué)領(lǐng)域的研究和應(yīng)用熱點之一,受到了學(xué)術(shù)界乃至工業(yè)界的廣泛關(guān)注。
超采樣反走樣(SSAA)技術(shù)[2]一直都是圖形學(xué)領(lǐng)域反走樣的黃金標(biāo)準(zhǔn),SSAA通過增加采樣數(shù)能夠有效地緩解圖形學(xué)中的幾何走樣和著色走樣問題,但在計算量,內(nèi)存占用和傳輸帶寬方面帶來了巨大的開銷,難以在實時應(yīng)用中使用。隨后,NVIDIA推出了GeForce3顯卡,它提供了對多重采樣的硬件支持,多重采樣反走樣(MSAA)技術(shù)[3]將可見性函數(shù)從著色當(dāng)中分離出來,對每個像素只需進行一次著色計算,大大減少了計算量,但它不能解決因著色導(dǎo)致的走樣問題,并且基于硬件的MSAA難以支持傳統(tǒng)的延遲著色[4]框架。近年來,基于圖像的后處理反走樣算法[5]因與延遲著色技術(shù)有良好的兼容性,成為了計算機圖形學(xué)領(lǐng)域的研究熱點。后處理反走樣算法的主要思想是對繪制出的圖像進行邊緣檢測,然后對邊緣像素點作平滑處理,一般是以邊緣像素及其周圍像素的顏色來計算其最終的顏色。反走樣作為后期處理,可以很容易地集成到任何游戲架構(gòu)的渲染管線中,但其缺乏足夠的子像素精度,時間穩(wěn)定性較差,還會導(dǎo)致最終結(jié)果變得模糊,因為邊緣檢測算法很難區(qū)分有意的顏色不連續(xù)和不完美渲染造成的不必要的走樣。
時間性反走樣(TAA)算法[6-10]的出現(xiàn)解決了SSAA的效率問題和后處理反走樣算法的子像素精度等問題。其基本思想是將一個像素空間內(nèi)的多個采樣點分布在多個時間幀中,然后通過將多個時間幀中的采樣點信息進行混合來得到反走樣的效果。但在TAA中存在歷史顏色失效的像素,標(biāo)準(zhǔn)TAA試圖通過各種啟發(fā)式方法來解決該問題,對于存在子像素特征的場景將造成模糊、閃爍,子像素丟失的問題。本文在TAA的基礎(chǔ)上通過對與歷史失效像素重疊的三角形執(zhí)行稀疏超采樣的方法來解決這些問題。
TAA在它可以處理的情況下速度非??觳⑶夷艿玫胶芎玫姆醋邩有Ч?,然而在某些情況下,像素的顏色發(fā)生改變,將導(dǎo)致TAA中的歷史顏色失效。像素顏色發(fā)生改變的原因大致可以分為兩類:一類是可見性變化,由原來的不可見變?yōu)榭梢?,如被遮擋的物體、視錐體外的物體等;另一類是著色變化,如光照環(huán)境的改變,像素是否處于陰影中,半透明物體的影響等。重投影技術(shù)[6-10]將失效的歷史顏色混合進當(dāng)前幀中將造成重影現(xiàn)象。對于歷史顏色失效的像素,標(biāo)準(zhǔn)TAA試圖通過各種啟發(fā)式方法來解決,如最常見的鄰域裁剪[11-12]方法,它將歷史顏色限制在其鄰域像素顏色的范圍內(nèi)。
TAA中閃爍問題的根本原因在于場景中存在子像素特征。鄰域裁剪方法有一個基本假設(shè),圖像中的顏色具有連續(xù)性,某個像素的歷史顏色值應(yīng)該位于其鄰域像素顏色的范圍內(nèi)。如果該假設(shè)成立,則將歷史顏色限制在鄰域像素構(gòu)成的顏色范圍中是一種正確的做法。然而當(dāng)像素中存在子像素特征且其鄰域像素中不存在這個子像素特征時,該假設(shè)不成立,鄰域裁剪把子像素特征裁剪掉將導(dǎo)致像素顏色在幀間不斷變化,從而出現(xiàn)閃爍現(xiàn)象。該問題的基本解決方法是減小TAA中遞歸指數(shù)濾波器[13]的α值,使得當(dāng)前幀的子像素顏色對最終顏色的貢獻減少,歷史顏色的權(quán)重增加,通過這種方法來減少幀與幀之間顏色的變化差異。然而該方法會導(dǎo)致模糊現(xiàn)象的加重。
TAA存在的另一個問題是模糊,造成該問題的原因主要有三個:
(1)錯誤的mipmap計算
由于mipmap層級與圖片的分辨率有關(guān),TAA算法在每一幀中只采樣像素中的一個樣本點,在計算mipmap層級時使用的是屏幕分辨率,然而TAA的本質(zhì)是超采樣,實際上在計算mipmap層級時應(yīng)該使用超采樣的分辨率。mipmap層級的計算錯誤可以通過對計算得到的mipmap層級增加一個偏移來解決。
(2)不斷對歷史顏色緩沖進行重采樣
由于在每次迭代中,都使用雙線性濾波器對歷史顏色緩沖進行采樣,該采樣值來源于離采樣點最近的4個像素顏色值的加權(quán)和,而這4個像素的顏色值來源于更早歷史周圍的加權(quán)和,以此類推,隨著時間的增加,參與加權(quán)的像素的范圍就越來越大。解決該問題的一個方法是使用更好的重構(gòu)方法來代替線性插值方法,來使得插值出來的結(jié)果更加銳利,例如Catmull-Rom插值方法。
(3)混合了失效的歷史顏色
對于歷史顏色失效的像素,TAA使用當(dāng)前幀子像素顏色與歷史顏色的插值作為新的歷史顏色,新的歷史顏色值還是混合了失效的歷史顏色,這將導(dǎo)致最終的結(jié)果帶有模糊效果。
由1.2小節(jié)可知,TAA產(chǎn)生模糊的原因有三個,前兩個都可以采取一些有效的措施進行緩解,而對于使用啟發(fā)式方法導(dǎo)致的模糊問題暫時還沒找到合適的方法,該原因?qū)е碌哪:龁栴}將有可能造成一些子像素細(xì)節(jié)丟失。例如場景中鐵絲、細(xì)線等,由于它們過于精細(xì),將被背景顏色模糊使其消失在視線中。
本文算法的主要流程是在TAA繪制遍中生成一張層次化的分割掩碼紋理,其標(biāo)記出了屏幕中歷史顏色失效的像素,接著使用一個繪制遍對與這些像素重疊的三角形進行稀疏光柵化來得到超采樣的結(jié)果,最后在一個繪制遍中將TAA的結(jié)果和稀疏超采樣的結(jié)果混合得到最終的反走樣圖像。
稀疏光柵化的本質(zhì)就是在光柵化前拒絕不需要超采樣的三角形。如果三角形不與任何歷史顏色失效的像素重疊,則會在幾何著色器中剔除。本文使用層次化的分割掩碼來判斷三角形是否需要進行超采樣,其構(gòu)造過程如下:
(1)創(chuàng)建一張分割掩碼紋理,格式為三個顏色通道的浮點數(shù),并將其綁定到TAA繪制遍的幀緩沖對象上;
(2)在TAA階段使用領(lǐng)域裁剪中的判斷方法對像素的歷史顏色的有效性進行判斷,對于歷史顏色失效的像素,在分割掩碼紋理中寫入黃色,否則寫入藍色。最終將得到如圖1所示的分割掩碼,其中黃色像素為需要進行超采樣的像素;
圖1分割掩碼
(3)構(gòu)造一個層次化的分割掩碼,它是一個mipmapped的屏幕分辨率圖像。LOD級別i中的1個紋素對應(yīng)LOD級別i-1中的2×2個紋素,如果這4個紋素中有1個為黃色,則LOD級別i的紋素為黃色,否則為藍色,最終得到的層次化的分割掩碼如圖2所示。
本文使用圖3的三角形在裁剪空間下的邊界矩形作為其包圍體進行剔除判斷,如果三角形的邊界矩形處于分割掩碼的藍色區(qū)域內(nèi)則代表它不需要進行超采樣,可以在超采樣前將其剔除。
圖3三角形的邊界矩形
2.1小節(jié)構(gòu)造了層次化的分割掩碼,本文通過采樣對應(yīng)層級紋理中與三角形邊界矩形重疊的2×2個紋素來判斷三角形是否處于藍色區(qū)域,這種方法可以減少紋理的采樣次數(shù),將紋理的采樣次數(shù)與三角形的大小解耦,提高了三角形剔除的效率。本文使用采樣對應(yīng)層級的4個紋素來進行剔除判斷,而不是采樣該層級下一層級的1個紋素(下一層級的1個紋素總結(jié)了上一層級所對應(yīng)的2×2個紋素是否有黃色)。因為在采樣4個紋素的情況下紋理的LOD更容易計算,而且它更好地包含了三角形的邊界矩形。圖4(a)(綠色代表LOD層級j,藍色代表LOD層級j+1,紅色代表LOD層級j+2,橙色代表邊界矩形,黃色代表采樣的紋素)顯示了在LOD層級j采樣4個紋素,而如果只采樣1個紋素,需要分為兩種情況考慮:如果三角形的邊界框剛好處于LOD層級j+1的1個紋素中,則可以在該層級采樣1個紋素;但如果三角形的邊界框剛好處于LOD層級j+1的4個紋素的交界處,則需要如圖4(b)所示,在LOD層級j+2中采樣1個紋素。所以采樣1個紋素的LOD計算更加復(fù)雜,而且在某些情況下采樣紋素覆蓋的面積較大,將嚴(yán)重降低剔除的有效性。
圖4采樣紋素個數(shù)不同的效果對比
本文通過將三角形的三個頂點轉(zhuǎn)換到裁剪空間下,分別得到最小和最大的x和y坐標(biāo)來計算三角形在裁剪空間下的邊界矩形。這個邊界矩形將有兩個用途,一方面它確定了用于層次化分割掩碼紋理查找的紋理LOD層級,另一方面它還定義了用于紋理查找的紋理坐標(biāo)。計算紋理LOD的公式如下:
其中,ceil函數(shù)為向上取整函數(shù),W為三角形邊界矩形在屏幕空間下的寬度,H為三角形邊界矩形在屏幕空間下的高度。得到LOD后,可以使用邊界矩形的4個頂點作為紋理坐標(biāo)在紋理的LOD層級上進行采樣,如果4個采樣點得到的值都為藍色,則將該三角形剔除。
三角形剔除后,本文將對剩余的三角形使用8倍超采樣來得到稀疏超采樣的結(jié)果。在最終的繪制遍中,通過讀取分割掩碼紋理來對TAA和稀疏超采樣的結(jié)果進行混合。如果紋理采樣為藍色則使用TAA的結(jié)果,反之使用稀疏超采樣的結(jié)果。
PC配置:Intel Core i5-4460k 3.20GHz CPU,8G內(nèi)存,NVIDIA GeForce GTX-960顯卡;開發(fā)環(huán)境:CLion2019軟件開發(fā)平臺,C++編程語言,OpenGL三維圖形開發(fā)工具;場景配置:1573455個三角形面片的帶有3個點光源的LivingRoom模型。
為了驗證本文算法是否能有效解決傳統(tǒng)TAA中使用啟發(fā)式方法導(dǎo)致的問題,本節(jié)分別使用TAA算法和本文的算法對同一場景進行渲染,并對渲染結(jié)果進行分析。
如圖5(a)所示,使用了TAA算法的吊燈,其邊緣的部分子像素特征丟失,并且從放大的9幀細(xì)節(jié)可以看到子像素特征在幀間不斷變化,而圖5(b)使用了本文算法,有效地解決了吊燈邊緣子像素特征丟失及子像素特征在幀間變化導(dǎo)致的閃爍問題。在圖5的基礎(chǔ)上對場景中的攝像機進行移動,可以看到圖6(a)中的吊燈是模糊的,它還錯誤地混合了背后相框的顏色,沙發(fā)的許多細(xì)節(jié)部分也被模糊掉,而圖6(b)采用本文算法得到了清晰的吊燈和沙發(fā)。對比圖7中的兩個渲染結(jié)果,TAA得到的帆船上的細(xì)線由于模糊而丟失了細(xì)節(jié),而本文算法能很好的將其還原出來。圖8是在同一場景中兩個不同視線方向得到的分割掩碼圖,可以看出歷史顏色失效的像素還未達到整個屏幕的10%。
圖5吊燈效果對比圖
圖6動態(tài)場景中的效果對比圖
圖7帆船的效果對比圖
圖8分割掩碼圖
本文在TAA的基礎(chǔ)上提出了一種自適應(yīng)時間性反走樣算法,其主要思想是將屏幕像素分類處理,在大多數(shù)像素上使用TAA的結(jié)果,對歷史顏色失效的稀疏像素執(zhí)行超采樣。實驗證明對于存在子像素特征的像素,使用超采樣在同一幀中采多個樣本點,能有效地保留子像素特征信息,解決了由于子像素特征在幀間變化導(dǎo)致的閃爍問題,并且對于歷史顏色失效的像素,丟棄了先前幀錯誤的反走樣顏色,只使用當(dāng)前幀該像素的反走樣結(jié)果,避免了混合錯誤的歷史顏色而產(chǎn)生模糊現(xiàn)象,也進一步解決了子像素細(xì)節(jié)丟失的問題。在以后的研究中,將會考慮對屏幕中的每個像素使用不同的抖動以達到更好的反走樣效果。