本篇文章主要向大家介紹GRLAA(GRadient Line Anti-Aliasing,梯度線抗混疊)技術(shù),這種縮寫是一種相對簡單且高效的用來區(qū)分別名的方法,而且經(jīng)常會在汽車導(dǎo)航應(yīng)用中見到。
在信號處理的準(zhǔn)則中,存在一個特定的采樣頻率稱為奈奎斯特頻率 ,當(dāng)我們對某個信號的采樣頻率低于奈奎斯特頻率時,那么從采樣點恢復(fù)恢復(fù)出的信號是與原始信號不同的。原始信號與重構(gòu)信號體現(xiàn)出的差別,這個效果成為“混疊”。
這里我們將與大家討論在計算機圖形中混疊效果最普遍的兩種體現(xiàn)。第一種就是鋸齒(如圖1所示),主要就是在斜直線的方向上呈現(xiàn)鋸齒狀的階梯。這是在顯卡光柵渲染階段像素之間產(chǎn)生的。
圖1:抗混疊效果對比(左:禁止,右:允許)
第二個是采樣混疊。當(dāng)較高頻率(快速變化)的紋理用于渲染遠(yuǎn)景的一些對象時,比如圖2所示的棋盤模式,我們能夠清晰的看到一些混疊效果,稱為云紋圖案模式。
圖2:紋理混疊:雙線性濾波(左)和三線性濾波-MIP貼圖(右)
目前有多種算法能夠降低這些可見的混疊現(xiàn)象,甚至消除鋸齒效果。然而這些算法會占用相當(dāng)一部分的系統(tǒng)性能,當(dāng)然這與你使用的硬件平臺也有關(guān)系。
·超級采樣抗混疊(SSAA)技術(shù):這是一種比較“暴力”的方式,首先以較高的分別率(最終所期望的整數(shù)倍x2、x4)來渲染整個場景,然后對整個幀緩沖區(qū)進(jìn)行采樣最終生成我們需要的最終分辨率。最終效果顯示這種方法在質(zhì)量上有保證,而且優(yōu)化了鋸齒和紋理采樣,但是這個技術(shù)的實現(xiàn)成本代價很大。渲染的代價——包括光柵渲染、分片渲染以及相應(yīng)的帶寬——一般都是分辨率的平方,比如x2 SSAA對應(yīng)的代價就是x4,x4 SSAA對應(yīng)的代價就是x16。
·多采樣抗混疊(MSAA)技術(shù):這個方法會增加每個像素點的采樣數(shù)量,將渲染的圖像添加到緩沖區(qū),并且能夠存儲每個像素點的多個采樣值。然后通過緩沖區(qū)輸出符合我們所期望的圖像分辨率。這種技術(shù)在PowerVR硬件平臺上非常高效而且全部是在芯片內(nèi)部解決,節(jié)省了內(nèi)存帶寬。MSAA能夠優(yōu)化鋸齒但是對于采樣效果無能為力。
· 基于著色器(Shader)技術(shù)如快速近似抗混疊(FXAA)或亞像素形態(tài)抗混疊(SMAA),這兩種方式都是采用分析來檢測和模糊銳利的幾何特性。同時也會在顯示環(huán)節(jié)采用后處理算法,付出的代價一般都是固定的(單個全屏幕通過)但是會需要更大的存儲帶寬,顯然這對于移動和嵌入式設(shè)備來講是非常寶貴的。
梯度線抗混疊技術(shù)簡介
Gerry Raptis是PowerVR SDK開發(fā)團(tuán)隊的主管,是他開發(fā)的GRLAA技術(shù)來改進(jìn)我們正在設(shè)計的導(dǎo)航應(yīng)用演示Demo。
GRLAA技術(shù)大幅度提升了道路幾何圖形邊沿的可視化質(zhì)量,所需要的計算成本也相對較低。除此以外這使得沒必要再添加道路輪廓了。輪廓能夠提升道路邊沿的可視化程度,方便用戶識別,更加清楚的區(qū)分道路邊界。
圖3:抗混疊道路圖形輪廓
這個方法背后的一般想法就是渲染道路的不透明區(qū),然后逐漸提升透明度,即在道路幾何圖形的上面或者邊緣提升像素的百分比。
任何分片的alpha通道都是基于兩個值。第一個是分片區(qū)與道路邊沿的距離,第二個是這個距離的變化率,即我們常說的梯度,或者更正式的來說就是距離的偏導(dǎo)數(shù)。
每個分片的RGB顏色數(shù)值是通過計算(0,0,0)三者之間的差值來確定的,生成一個固定的黑色輪廓(或者其他顏色的輪廓)和道路的平面顏色,然后將統(tǒng)一數(shù)據(jù)傳遞給分片的著色器。所有這些計算都是基于差值t,這個值時通過相對距離和變化率來計算確定的。后面的內(nèi)容會更加詳細(xì)的介紹如何推算這些數(shù)值,以及這些數(shù)值對GRLAA技術(shù)的重要性。
這個算法目前的形式可能沒有太大的價值,只適用于一些具有已知寬度的幾何圖形,比如一條路或者一條線等。
GRLAA技術(shù)詳細(xì)分析
為了確定正確的融合水平,這個算法需要知道距離道路邊沿的距離,因為這會影響融合的強度。這意味著數(shù)據(jù)集中每個幾何頂點需要附加額外的頂點補償數(shù)據(jù),必須是某個兩個常量值之一,即-1或1。這個賦值應(yīng)該在奇數(shù)和偶數(shù)之間變換,這表示道路的一側(cè)會接收基礎(chǔ)值-1而另一側(cè)則對應(yīng)基礎(chǔ)值1。這些數(shù)據(jù)會作為幾何頂點數(shù)據(jù)上傳給圖形卡硬件,經(jīng)過分片著色器計算才能確定最終的alpha通道值。
給每個頂點賦值的基礎(chǔ)值按道路的兩側(cè)來分是不同的,比如左手側(cè)和右手側(cè)。因為這些頂點數(shù)據(jù)會被分片著色器用于計算,它們自動會被硬件進(jìn)行插值轉(zhuǎn)換。
圖4:代表幾何的基礎(chǔ)屬性值
插值轉(zhuǎn)換后的基礎(chǔ)值會用于計算當(dāng)前分片與道路邊沿的距離。比如道路中心的分片相對于道路的兩邊都是最遠(yuǎn)的,意味著相對距離如果是1,那么就能夠有效的接收不需要融合。隨著分片距離道路邊沿越來越近,相對距離會接近到0,隨之需要接收更多的融合。
float distance = 1.0 – abs(roadBaseVal);
既然我們已經(jīng)確定了道路邊沿相對道路寬度的相對距離,那么我們就需要確定渲染的道路輪廓的寬度。算法的第二大部分主要涉及需要渲染的分片百分比。
頂點數(shù)據(jù)的基礎(chǔ)插值作為標(biāo)準(zhǔn)的GLSL偏導(dǎo)(梯度)函數(shù)的參數(shù)。函數(shù)“dFdX”和“dFdY”一般分別用來計算給定值在X方向和Y方向上的變化率,而且通常由一個小型網(wǎng)格(2x2)的分片來確定的。
計算過程能夠輸出當(dāng)前分片距道路邊沿相對距離的變化速率,根據(jù)當(dāng)前分片與相鄰分片的偏導(dǎo)數(shù)來推算?;谥付ǚ制淖兓饰覀兡軌蛴嬎愠龊线m的alpha通道值。最終結(jié)果則決定了分片的百分比,即定義了道路的邊沿,此外為了繪制一個平滑的輪廓,我們還需要處理更多個分片。
#define ANTIALIAS_STRENGTH 2. // Constant affects how much AA will be applied, a higher value //will increase blurring at the cost of reduced detail, while a lower value will reduce the //amount of blurring at the cost of more aliasing.
float blend_range = ANTIALIAS_STRENGTH * sqrt(dFdx(roadBaseVal) * dFdx(roadBaseVal) + dFdy(roadBaseVal) * dFdy(roadBaseVal));
float blend_halfrng = 0.5 * blend_range;
變化率非常的重要,只有它才能夠讓算法不必考慮顯示屏幕上道路的規(guī)模和尺寸。使用偏導(dǎo)數(shù)函數(shù)能夠確定某對象所占用屏幕空間的百分比,比如下面的情況:
· 如果對象占用屏幕空間比較?。s放),那么占用的像素點需要進(jìn)行融合渲染來實現(xiàn)比較光滑的邊沿效果,等同于占用較大百分比的屏幕像素空間。這是因為變化率比較大,基值是通過少量分片插值變換得出的。因此需要開始渲染距離道路邊沿較遠(yuǎn)的分片,這時就可能出現(xiàn)鋸齒。
· 相反,如果對象占用屏幕空間比較大(放大),那么占用的像素點需要通過融合渲染來降低占用的總像素數(shù)的百分比。這時變化率會比較低,基值的差值轉(zhuǎn)換會涉及到更多的分片。因此就需要開始融合渲染距離道路邊沿比較近的分片。如果結(jié)果比需要的百分比大,那么道路就會變得模糊。
圖5:變化率,縮小vs放大
所有組件確定后就可以計算分片的最終顏色值,通過在輪廓顏色(這里主要是黑色)閾值和道路顏色(統(tǒng)一標(biāo)準(zhǔn))閾值之前進(jìn)行插值變換,我們才能夠計算出RGB組件的屬性值,插值變換是從相對距離和變化率衍生而來的。同時alpha組件的值也是通過相似的方式來計算,但是不需要進(jìn)行插值轉(zhuǎn)換。
#define OUTLINE_WIDTH 0.25 //How large our outline will be relative to the road width
float outline_distance = clamp(((distance – OUTLINE_WIDTH – blend_halfrng) / blend_range) + 0.5, 0.0, 1.0);
float blend_distance = clamp(((distance – blend_halfrng) / blend_range) + 0.5, 0.0, 1.0);
oColour.rgb = mix(vec3(0.0, 0.0, 0.0), roadColour.rgb, outline_distance);
oColour.a = blend_distance;
相比之前基于紋理抗混疊方法,GRLAA最主要的優(yōu)勢就是mip-map不需要任何依賴?;诩y理的方法會在抗混疊像素的數(shù)量上有一定的限制,尤其當(dāng)幾何圖形被最小化后,因此我們采用基于mip-map的圖形技術(shù),本篇文章介紹的算法在處理任何尺寸的幾何圖形時都不會有問題,能夠輸出非常清晰高質(zhì)量的抗混疊效果的邊緣輪廓,而且不受對象尺寸和方向的限制。
第二個優(yōu)勢就是這個算法不需要任何的紋理資源,這樣就會降低整體的存儲帶寬。這絕對是一個好消息,因為釋放的一些存儲帶寬可以用于其他功能,尤其占用較多紋理資源的技術(shù)。
最后,就循環(huán)計算操作來講這個算法的代價相對還是比較小的,因此不會明顯增加計算負(fù)擔(dān)。我們經(jīng)過測量發(fā)現(xiàn)執(zhí)行所有的著色器大概需要20個操作循環(huán)。此外根據(jù)你所采用的圖像卡核心,設(shè)置中等精確度會進(jìn)一步降低循環(huán)操作。
評論
查看更多