鋸齒和抗鋸齒
想象一個(gè)大的黑色三角形沿白色背景緩慢移動(dòng)袱耽。一個(gè)單元屏幕網(wǎng)格由三角形覆蓋蚁趁,我們所期望的是移動(dòng)時(shí)該單元的像素值會(huì)平滑的變化扶踊。然而泄鹏,在基本的渲染器中,通常發(fā)生的情況是網(wǎng)格單元的中心為完全覆蓋秧耗,像素顏色會(huì)直接從白色變?yōu)楹谏缸选?biāo)準(zhǔn)GPU渲染也沒有例外,注意下圖最左邊的圖:
三角形的像素只有有顏色和無顏色兩種分井,線的繪制也有類似的問題车猬,邊就是因?yàn)檫@種原因有鋸齒感,所以這種視覺粗糙感也被稱為鋸齒尺锚,在動(dòng)畫中也被稱為“小爬蟲”珠闰。更加正式的說法是失真/鋸齒(aliasing),避免這種效果的技術(shù)稱為抗鋸齒技術(shù)缩麸,或者說反走樣技術(shù)铸磅。
采樣和濾波理論
渲染圖像的過程赡矢,內(nèi)部其實(shí)是一個(gè)采樣任務(wù)杭朱,這么說的原因是由于圖像的生成過程其實(shí)是對(duì)一個(gè)三維場景的進(jìn)行對(duì)要生成圖像的每個(gè)像素進(jìn)行采樣獲取顏色進(jìn)行填充的過程阅仔。為了使用紋理映射,紋素必須進(jìn)行重新采樣來在多種不同的情況下獲得較好的結(jié)果弧械。為了生成動(dòng)畫序列圖八酒,動(dòng)畫經(jīng)常會(huì)在一個(gè)一個(gè)統(tǒng)一的時(shí)間間隔中進(jìn)行采樣。這一節(jié)是對(duì)采樣刃唐,重建和濾波的介紹羞迷,為了簡潔性,大多數(shù)的材質(zhì)會(huì)表示為一維狀態(tài)画饥。這些改變也可以很簡單地拓展到二維衔瓮,用來處理二維圖像。
下圖展示了將一個(gè)連續(xù)的信號(hào)采樣為統(tǒng)一間隔的離散信號(hào)的過程:
這個(gè)采樣過程的目的是數(shù)字化信息抖甘,這么做的話热鞍,信息的數(shù)量就會(huì)減少。然而衔彻,采樣信號(hào)需要被重構(gòu)來恢復(fù)初始的信號(hào)薇宠,這通過濾波過程來完成。
無論采樣何時(shí)完成艰额,走樣都有可能出現(xiàn)澄港,畢竟這是我們大部分時(shí)候不想看到的現(xiàn)象,所以我們需要消除鋸齒感來生成看起來不錯(cuò)的圖像柄沮。一個(gè)經(jīng)典的鋸齒感回梧,或者說走樣的例子是車輪效應(yīng)。由于輻條的速度遠(yuǎn)快于攝像機(jī)記錄圖片的速度祖搓,所以輪子可能會(huì)看起來旋轉(zhuǎn)的很慢狱意,或者幾乎不旋轉(zhuǎn)。這一現(xiàn)象在下圖顯示:
這種效果出現(xiàn)的原因是輪子的圖片是在一系列事件步長中獲得的棕硫,這被稱為時(shí)間域走樣髓涯。
在圖形學(xué)領(lǐng)域的通常的走樣例子就是光柵線或三角形邊的鋸齒,被稱為“螢火蟲”現(xiàn)象的閃爍高光哈扮,還有當(dāng)使用棋盤格紋理時(shí)纬纪,會(huì)看起來變小。
走樣發(fā)生的原因是信號(hào)采樣頻率過低滑肉,那么所采樣的信號(hào)就會(huì)比原始信號(hào)頻率低包各,這在下圖顯示了:
為了得到采樣合適的信號(hào),采樣頻率需要是被采樣信號(hào)的頻率的兩倍以上靶庙,這通常被稱為定理问畅,采樣頻率被稱為奈奎斯特頻率或奈奎斯特限制。奈奎斯特限制也在車輪效應(yīng)那張圖顯示。采樣定理使用最大化頻率的術(shù)語的原因是其表明了信號(hào)需要是有限帶寬的护姆,這表明任何頻率不會(huì)超過確切的限制矾端。換句話說,信號(hào)需要根據(jù)與相鄰采樣信號(hào)的間距進(jìn)行足夠的平滑操作卵皂。
一個(gè)三維場景通常在使用點(diǎn)采樣進(jìn)行渲染時(shí)不會(huì)觸及帶寬限制秩铆。三角形邊,陰影邊界和其它效果會(huì)生成一個(gè)不連續(xù)變化的信號(hào)灯变,產(chǎn)生都頻率也是無窮大的殴玛。同樣,無論采樣的間距如何小添祸,物體仍會(huì)因?yàn)楹苄《鵁o法進(jìn)行完全采樣滚粟。因此,當(dāng)使用點(diǎn)采樣來渲染場景時(shí)是不可能完全避免走樣問題的刃泌,而且我們幾乎總是使用點(diǎn)采樣凡壤。然而,當(dāng)信號(hào)是有限帶寬的話蔬咬,有時(shí)就有可能完成鲤遥。一個(gè)例子是當(dāng)紋理被應(yīng)用于表面時(shí),我們可以根據(jù)與像素采樣速度的比較計(jì)算紋理采樣頻率林艘,如果這個(gè)而頻率小于奈奎斯特限制盖奈,不需要什么特殊的操作就可以合適地進(jìn)行紋理采樣,如果頻率過高狐援,就是用一些算法來對(duì)紋理進(jìn)行帶寬限制钢坦。
重構(gòu)
給定一個(gè)有限帶寬的采樣信號(hào),我們現(xiàn)在討論如何根據(jù)一個(gè)采樣信號(hào)來重構(gòu)出原始的信號(hào)啥酱。為了完成這一任務(wù),我們需要使用一個(gè)濾波器镶殷,三個(gè)通常使用的濾波器如下:
注意濾波器的面積應(yīng)該總是1禾酱,否則重構(gòu)后的信號(hào)會(huì)擴(kuò)大或縮小。
在下圖中绘趋,使用一個(gè)盒裝濾波器來重構(gòu)一個(gè)采樣信號(hào):
這是一個(gè)最菜的濾波器颤陶,結(jié)果是一個(gè)不連續(xù)的階梯式信號(hào),不過現(xiàn)在仍經(jīng)常用于圖形學(xué)中陷遮,因?yàn)檫@最簡單滓走。就如圖表中所看到的,盒狀濾波器放置在每個(gè)采樣點(diǎn)上帽馋,然后進(jìn)行縮放搅方,這樣濾波器的最上面的點(diǎn)就和采樣點(diǎn)重合比吭。這些信號(hào)結(jié)合在一起并進(jìn)行平移,重構(gòu)信號(hào)就在上圖右側(cè)顯示姨涡。
盒裝濾波器可以被其它濾波器替代衩藤。在下圖中,是一個(gè)三角濾波器绣溜,可以用來重構(gòu)采樣信號(hào)慷彤。
注意這一濾波器的實(shí)現(xiàn)是將相鄰的采樣點(diǎn)進(jìn)行線性插值娄蔼,所以效果比盒狀濾波器好怖喻,可以看到得到的信號(hào)是連續(xù)的。
然而岁诉,三角濾波器的重構(gòu)信號(hào)的平滑度很差锚沸,曲線在采樣點(diǎn)處會(huì)有坡度的突然變化,不得不承認(rèn)三角濾波器并不是一個(gè)完美的重構(gòu)濾波器涕癣。為了得到完美的重構(gòu)哗蜈,我們使用低通濾波器,這個(gè)信號(hào)的曲線是正弦的:坠韩,其中
是信號(hào)頻率距潘。一個(gè)低通濾波器會(huì)移除所有頻率比濾波器定義頻率高的組件,直觀來說只搁,低通濾波器會(huì)移除信號(hào)的銳利的部分音比,即濾波器會(huì)模糊信號(hào)。理想低通濾波器是一個(gè)辛格濾波器:
傅里葉分析的理論解釋了為什么辛格濾波器是理想低通濾波器氢惋。簡要來說洞翩,理由如下。理想低通濾波器在頻域內(nèi)是一個(gè)盒裝濾波器焰望,當(dāng)它與信號(hào)相乘后骚亿,可以移除所有超過濾波器寬度的頻率組件。將盒狀濾波器從頻域轉(zhuǎn)換到空間域得到一個(gè)辛格函數(shù)熊赖,同時(shí)相乘操作會(huì)轉(zhuǎn)換為一個(gè)卷積函數(shù)来屠,這是我們?cè)诒竟?jié)使用的方法,不需要確切描述該術(shù)語震鹉。
使用辛格濾波器來重構(gòu)信號(hào)可以得到平滑結(jié)果俱笛,這在下圖顯示:
采樣過程中信號(hào)會(huì)產(chǎn)生高頻率組件,低通濾波器的任務(wù)就是移除這些組件足陨。實(shí)際上嫂粟,辛格濾波器會(huì)去除所有頻率高于采樣率的組件∧担可以說星虹,在采樣頻率低于1.0時(shí)零抬,辛格濾波器是一個(gè)完美的重構(gòu)濾波器。對(duì)于更普遍的情況宽涌,假設(shè)采樣頻率為
平夜,那么樣本間距為
,對(duì)于這種情況卸亮,完美的重構(gòu)濾波器為
忽妒,消除所有頻率高于
的部分。這在重采樣信號(hào)時(shí)很有用兼贸,然而段直,辛格濾波器的寬度是無窮大的,所以在部分區(qū)域時(shí)負(fù)的溶诞,實(shí)際中會(huì)很少使用鸯檬。
在低質(zhì)量的盒裝、三角濾波器和不實(shí)際的濾波器間存在一個(gè)很有用的中間濾波器螺垢,大多數(shù)廣泛使用的濾波器函數(shù)就在這些極端之間喧务,所有這些濾波器函數(shù)和辛格函數(shù)類似,但對(duì)于影響像素的數(shù)量有一定的限制枉圃。過于近似辛格函數(shù)的濾波器會(huì)有超過它們作用域的負(fù)值功茴,對(duì)于應(yīng)用程序,負(fù)濾波器值是不想遇到的孽亲,也是不實(shí)際的坎穿,沒有負(fù)葉的濾波器通常會(huì)被使用(如高斯濾波器)。
在使用這些濾波器后墨林,可以獲得連續(xù)的信號(hào)赁酝,然而,在計(jì)算機(jī)圖形學(xué)中我們不能直接顯示連續(xù)的信號(hào)旭等,但我們可以將連續(xù)信號(hào)重新采樣為其它的大小酌呆,放大或縮小。
重采樣
重采樣通常用來放大和縮小采樣信號(hào)搔耕,假設(shè)原始采樣點(diǎn)在整數(shù)坐標(biāo)處(0,1,2,...)隙袁,即采樣點(diǎn)間是一個(gè)單位長度。此外弃榨,假設(shè)在重采樣后我們想要新的采樣點(diǎn)定位在統(tǒng)一的單位間隔菩收,對(duì)于
,使用縮小操作(降采樣)鲸睛,對(duì)于
娜饵,使用放大操作(增采樣)。
擴(kuò)大操作比較簡單官辈,我們先介紹這個(gè)箱舞。假設(shè)采樣信號(hào)按照上節(jié)的方法重構(gòu)了遍坟,直觀來說,由于信號(hào)現(xiàn)在被完美重構(gòu)晴股,而且連續(xù)愿伴,我們需要做的就是按照想要的間隔對(duì)信號(hào)進(jìn)行重采樣和重構(gòu)。這一過程在下圖顯示:
然而电湘,這一技術(shù)在縮小操作時(shí)并不適用隔节。原始信號(hào)的頻率過高,沒有辦法避免走樣寂呛,這樣就必須用一個(gè)使用的濾波器來根據(jù)采樣信號(hào)創(chuàng)建連續(xù)信號(hào)怎诫,之后,就可以使用所期望的間隔來進(jìn)行重采樣昧谊,這在上圖下方顯示:
換種方式解釋就是刽虹,通過使用來作為濾波器,低通濾波器的寬度會(huì)增加呢诬,那么更多的高頻率部分會(huì)被移除。就如上圖顯示胖缤,濾波器的寬度會(huì)變?yōu)閮杀渡辛缓髮⒉蓸勇蕼p少為其一半。將這一點(diǎn)與數(shù)字圖像關(guān)聯(lián)的話哪廓,就類似于先模糊然后按照低分辨率采樣圖片狗唉。
基于屏幕的抗鋸齒
如果沒有合適的采樣和使用濾波器,那么三角形的邊會(huì)產(chǎn)生可以看到的粗糙感涡真。陰影邊界分俯、高光和其它效果的顏色迅速變化時(shí)也會(huì)產(chǎn)生類似的問題。在這一節(jié)討論的算法可以幫助提升渲染質(zhì)量來應(yīng)對(duì)這些問題哆料,并且這些算法都是基于屏幕的缸剪,即它們只處理管線的輸出采樣樣本。并不存在一個(gè)最好的抗鋸齒技術(shù)东亦,每一種有不同的質(zhì)量優(yōu)點(diǎn)杏节,也有能力獲得銳利細(xì)節(jié)或其它現(xiàn)象,在移動(dòng)時(shí)的表現(xiàn)典阵、內(nèi)存消耗奋渔、GPU要求和速度上也都同。
對(duì)于本章開頭提到的黑色三角形例子壮啊,其中一個(gè)問題是采樣率低嫉鲸,只在每個(gè)像素網(wǎng)格單元的中心獲取一個(gè)采樣點(diǎn),所以能獲得信息只是當(dāng)前像素是否被三角形覆蓋歹啼,通過在每個(gè)屏幕網(wǎng)格單元使用更多的采樣點(diǎn)玄渗,并以某種方式混合的話减江,就可以計(jì)算得到比較好的顏色效果,原理在下圖描述:
基于屏幕抗鋸齒的一般策略對(duì)屏幕使用一個(gè)采樣組件然后按權(quán)重將樣本累加起來獲得一個(gè)像素顏色:
其中是一個(gè)像素使用的采樣樣本數(shù)捻爷,函數(shù)
是樣本顏色辈灼,
是權(quán)重,范圍在
內(nèi)也榄。樣本位置取決于使用所有樣本中的哪一個(gè)樣本巡莹,函數(shù)往往使用整數(shù)部分的像素位置
。換句話說甜紫,在屏幕網(wǎng)格上獲得樣本互不相同降宅,每個(gè)像素可選的采樣組件也不同。在渲染系統(tǒng)中樣本通常是點(diǎn)樣本囚霸。所以腰根,函數(shù)
可以被認(rèn)為是兩個(gè)函數(shù)組成的,首先是函數(shù)
來獲得需要樣本點(diǎn)在屏幕上的浮點(diǎn)位置
拓型。屏幕上的位置然后被采樣额嘿,即獲得精確點(diǎn)的顏色。采樣的模式是可以選擇的劣挫,渲染管線可以自行配置來計(jì)算在特定子像素位置的樣本册养,基于每幀的設(shè)置。
抗鋸齒中的另一個(gè)變量是压固,即每個(gè)樣本的權(quán)重球拦,這些權(quán)重加起來和為1。大多數(shù)的實(shí)時(shí)渲染系統(tǒng)使用的方法對(duì)它們的采樣點(diǎn)給定統(tǒng)一的權(quán)重,即
。圖形硬件默認(rèn)的模式是每個(gè)像素有一個(gè)中心采樣點(diǎn)甘改,這是上述抗鋸齒等式最簡單的情況。
每個(gè)像素使用多個(gè)采樣點(diǎn)的抗鋸齒算法被稱為超級(jí)采樣方法谣光。概念上最簡單的是全屏幕抗鋸齒(FSAA),也被稱為超級(jí)采樣抗鋸齒(MSAA)矿咕,可以高分辨率的渲染場景抢肛,然后濾波鄰近的樣本點(diǎn)來創(chuàng)建圖像。例如碳柱,假設(shè)想要一幅分辨率為1280x1024的圖像捡絮,如果離屏渲染一幅2560x2048的圖像,然后平均化屏幕上的每個(gè)2x2像素區(qū)域莲镣,那么目標(biāo)圖片就是每個(gè)像素4個(gè)采樣點(diǎn)生成的福稳,通過一個(gè)盒裝濾波器濾波。這種與2x2網(wǎng)格相關(guān)的采樣網(wǎng)格在下圖顯示:
不過這種方式開銷較大瑞侮,因?yàn)槊總€(gè)子樣本必須被完全著色和填充的圆,每個(gè)采樣點(diǎn)都有一個(gè)深度值鼓拧。FSAA的主要的優(yōu)點(diǎn)就是簡單。另外越妈,這種采樣方式的低質(zhì)量版本是在一個(gè)屏幕軸上采樣兩側(cè)季俩,也被稱為1x2或2x1超級(jí)采樣。通常梅掠,出于簡潔考慮酌住,會(huì)使用二次方分辨率和盒狀濾波器。英偉達(dá)的動(dòng)態(tài)超級(jí)分辨率特性就是一種超級(jí)采樣的更高級(jí)的組成阎抒,場景會(huì)以高分辨率渲染酪我,然后有13個(gè)采樣點(diǎn)的高斯濾波器會(huì)用來生成要顯示的圖片。
一種和超級(jí)采樣相關(guān)的采樣方法基于累計(jì)緩沖的概念且叁。不再不使用大的離屏緩沖都哭,這個(gè)方法使用一個(gè)和預(yù)期圖像分辨率相同的緩沖,但顏色的每個(gè)通道的比特?cái)?shù)更多逞带。為了得到一個(gè)場景的2x2采樣欺矫,要生成4張圖像,同時(shí)根據(jù)需要在屏幕x或y方向上移動(dòng)半個(gè)像素掰担。每張圖片的生成基于網(wǎng)格單元下的一個(gè)不同的采樣位置汇陆。每幀重渲染場景幾次的額外的開銷以及將結(jié)果復(fù)制到屏幕讓這個(gè)算法對(duì)于實(shí)時(shí)渲染系統(tǒng)來說開銷較大。當(dāng)性能并不那么重要時(shí)带饱,使用這個(gè)方法來生成高質(zhì)量圖像的話是挺有用的,因?yàn)榉胖迷谌魏挝恢萌魏螖?shù)量的采樣點(diǎn)可以逐像素使用阅羹。累計(jì)緩沖過去常是硬件的一個(gè)獨(dú)立部分勺疼,它在OpenGLAPI中支持,但在3.0版本中棄用了捏鱼。在現(xiàn)代GPU中执庐,累計(jì)緩沖的概念可以在像素著色器中實(shí)現(xiàn),通過將高精度顏色格式輸出到緩沖中导梆。
當(dāng)使用類似物體邊緣轨淌、高光和銳利陰影等造成銳利顏色改變的效果時(shí),額外的采樣是必須的看尼。陰影可以制作得很柔和递鹉,高光也可以平滑來避免鋸齒感。特殊的物體類型的大小會(huì)因此會(huì)增加藏斩,例如電線躏结,因此它們需要確保沿其長度分布方向的位置上至少要覆蓋一個(gè)像素。物體邊緣的鋸齒仍是一個(gè)主要的采樣問題狰域,當(dāng)物體邊緣可以在渲染是檢測到媳拴,并且受因數(shù)影響時(shí)黄橘,可以使用分析的方法來解決,但這樣的話開銷會(huì)很大屈溉,而且簡單的增加采樣數(shù)的話塞关,穩(wěn)定性會(huì)很低。然而子巾,GPU的類似保守光柵化和光柵器順序圖表的特性帶來的新的可能性帆赢。
例如超級(jí)采樣和累計(jì)緩沖的技術(shù)通過生成采樣點(diǎn)來實(shí)現(xiàn),并且完全由獨(dú)立計(jì)算的光影和深度值指定砰左。整體的優(yōu)點(diǎn)相對(duì)較差匿醒,并且開銷較大,因?yàn)槊總€(gè)采樣點(diǎn)都必須調(diào)用一次像素著色器缠导。
多重采樣抗鋸齒(MSAA)減少了高額計(jì)算帶來的開銷廉羔,通過每像素計(jì)算一次表面著色,并且在采樣點(diǎn)間共享結(jié)果僻造。假如每個(gè)像素片段由四個(gè)采樣點(diǎn)位置憋他,每個(gè)采樣點(diǎn)有它自己的顏色和深度值,但對(duì)于每個(gè)像素的片段髓削,像素著色器只會(huì)調(diào)用一次竹挡。如果所有MASS的位置采樣點(diǎn)由一個(gè)片段覆蓋,那么著色采樣點(diǎn)就在像素的中間立膛。反之揪罕,如果片段只覆蓋少量的位置采樣點(diǎn),著色采樣點(diǎn)的位置可以被移動(dòng)到新的位置來更好的表示位置覆蓋宝泵。舉個(gè)例子好啰,這樣可以避免著色采樣離開紋理的邊界。這種位置調(diào)整被稱為質(zhì)心采樣或質(zhì)心插值儿奶,如果啟用的話GPU會(huì)自動(dòng)執(zhí)行這個(gè)過程框往。質(zhì)心采樣避免了離開三角形的問題,但會(huì)導(dǎo)致導(dǎo)數(shù)計(jì)算出現(xiàn)不正確的值闯捎。如下圖:
因?yàn)槠沃恍柚淮我祝訫SAA比常規(guī)的超級(jí)采樣模式要快。它以更高的速度聚焦于計(jì)算采樣的覆蓋程度瓤鼻,并且共享所計(jì)算的著色秉版。通過分離采樣和覆蓋會(huì)有可能節(jié)省更多內(nèi)存,它們輪流執(zhí)行娱仔,可以讓抗鋸齒更快沐飘,即使用更少的內(nèi)存,渲染速度更快。2006年耐朴,英偉達(dá)介紹了一種技術(shù)借卧,名為覆蓋采樣抗鋸齒(CSAA),AMD緊隨其后提出了加強(qiáng)質(zhì)量抗鋸齒(EQAA)技術(shù)筛峭。這些技術(shù)通過以更高的速度只存儲(chǔ)片段的覆蓋來實(shí)現(xiàn)铐刘,例如,EQAA的2f4x模式存儲(chǔ)兩個(gè)顏色和深度值影晓,并在四個(gè)采樣位置間分享镰吵。顏色和位置并不只存儲(chǔ)于特定的位置,而是存儲(chǔ)在一個(gè)表中挂签。4個(gè)采樣點(diǎn)的每一個(gè)接著就只需要一個(gè)位來指出兩個(gè)存儲(chǔ)值的哪一個(gè)于它的位置相綁定疤祭。見上面那張圖。覆蓋采樣點(diǎn)指出了每個(gè)片段對(duì)最終像素顏色的貢獻(xiàn)饵婆。如果顏色存儲(chǔ)的數(shù)量溢出勺馆,一個(gè)已存儲(chǔ)的顏色值會(huì)彈出,然后它的采樣點(diǎn)被標(biāo)記為未知侨核,然后這些采樣點(diǎn)不會(huì)為最終顏色做出貢獻(xiàn)草穆。對(duì)于大多數(shù)場景,相對(duì)來說只有很少的像素包含3個(gè)或更多的互不相同的可見不透明片段搓译,因此這種模式在實(shí)際中表現(xiàn)不錯(cuò)悲柱。然而,對(duì)于更高的質(zhì)量些己,《極限競速 地平線》這款游戲使用了4x的MSAA豌鸡,盡管EQAA性能更好。
一旦所有的幾何體被渲染到多重采樣緩沖段标,接下來會(huì)執(zhí)行一個(gè)解析操作直颅。這個(gè)過程會(huì)平均所有的樣本顏色,用來決定像素的顏色怀樟。值得注意的是當(dāng)使用高動(dòng)態(tài)顏色范圍時(shí),使用多重采樣會(huì)躁癥問題盆佣,在這些情況下往堡,我們需要在解析前進(jìn)行色調(diào)映射來解決問題,這個(gè)操作可能會(huì)開銷較大共耍,所以會(huì)使用其它更簡單的色調(diào)映射函數(shù)近似或其它方法虑灰。
默認(rèn)的,MSAA使用一個(gè)盒狀濾波器來解析痹兜。在2007年穆咐,ATI介紹了一種名為自定義濾波器抗鋸齒的技術(shù)(CFAA),使用狹窄且寬廣的三角濾波器來擴(kuò)展到其它的像素單元。這個(gè)模式曾用來代替EQAA对湃。在現(xiàn)代GPU中崖叫,像素或計(jì)算著色器可以獲取MSAA的樣本,可以使用任何重構(gòu)濾波器拍柒,包括從臨近像素樣本獲取采樣的方法心傀。一個(gè)更寬廣的濾波器可以減少鋸齒,但會(huì)損失尖銳細(xì)節(jié)拆讯。Pettineo發(fā)現(xiàn)三次方平滑插值和擁有2個(gè)或3個(gè)像素寬度的B樣條濾波器可以整體獲得很好的效果脂男。不過同樣存在性能消耗,因?yàn)槭褂靡粋€(gè)自定義的著色器來模擬默認(rèn)的盒狀濾波器解析會(huì)花費(fèi)更長的時(shí)間种呐,且更寬的濾波器核就意味著增加樣本的訪問消耗宰翅。
英偉達(dá)內(nèi)置的TXAA提供一種類似的方法,使用一種覆蓋更廣范圍的重構(gòu)濾波器爽室,相比單個(gè)像素的汁讼,可以獲得更好的效果。TXAA和更新的MFAA(多幀抗鋸齒)模式都使用暫存抗鋸齒(TAA)肮之,這是一種通用的使用來自前一幀的結(jié)果來優(yōu)化圖像的技術(shù)掉缺。某種程度上這種技術(shù)可以實(shí)現(xiàn)的前提在于程序員可以每幀設(shè)置MSAA的采樣模式。這樣的技術(shù)可以解決類似車輪效應(yīng)的走樣問題戈擒,也可以提升物體邊的渲染質(zhì)量眶明。
想象以下通過生成一系列圖片來手動(dòng)執(zhí)行一個(gè)采樣模式,其中的圖片是每個(gè)渲染器使用每個(gè)采樣點(diǎn)獲取的像素下的一個(gè)不同位置生成的筐高。這種偏移是通過向投影矩陣中添加一個(gè)微小的平移量完成的搜囱。生成和平均在一起的圖片越多,結(jié)果就越好柑土。多重偏移圖片的理念在暫存抗鋸齒算法中使用蜀肘。一張圖片生成,可能使用MSAA或其它方法稽屏,然后與上一張圖片混合在一起扮宠。通常只有兩幀或四幀會(huì)被使用。之前的圖片可能會(huì)以指數(shù)級(jí)別降低權(quán)重狐榔,盡管當(dāng)觀察者和場景不移動(dòng)時(shí)坛增,會(huì)造成幀閃爍的效果,所以會(huì)讓前一幀和當(dāng)前幀的權(quán)重設(shè)為相等薄腻。通過使用在一個(gè)不同的子像素位置上的幀采樣收捣,這些采樣的加權(quán)和可以得到比單幀操作更好的平均邊估計(jì)效果。所以一個(gè)使用前兩幀來進(jìn)行平均的系統(tǒng)可以得到更好的結(jié)果庵楷。每幀不需要額外的采樣點(diǎn)罢艾,這是讓這種類型的方法更吸引人的原因楣颠。甚至可能使用暫存采樣來允許高于顯示器分辨率的低分辨率圖片的生成巷帝。另外奋隶,光照算法或其它需要更多采樣數(shù)才獲取更好結(jié)果的技術(shù)可以取而代之的每幀使用很少的采樣點(diǎn),這是因?yàn)榻Y(jié)果可以在幾幀上混合盲镶。
當(dāng)為沒有額外采樣消耗的靜態(tài)場景提供抗鋸齒時(shí)仓蛆,對(duì)于暫存抗鋸齒睁冬,這種算法會(huì)帶來一些問題。如果每幀的權(quán)重不相等看疙,靜態(tài)場景中的物體會(huì)閃爍顯示豆拨。快速移動(dòng)物體或快速移動(dòng)攝像機(jī)會(huì)躁癥幽靈效果能庆,即物體會(huì)有拖尾軌跡施禾,這是前一幀混合的結(jié)果。一種解決幽靈效果的解決方法是只在緩慢移動(dòng)的物體上使用這種抗鋸齒搁胆。另一種重要的方法是使用重投影來更好地將前一幀和當(dāng)前幀物體關(guān)聯(lián)在一起弥搞。在這種模式下,物體生成一些運(yùn)動(dòng)矢量渠旁,被存儲(chǔ)在一個(gè)獨(dú)立的速度緩沖中攀例,這些矢量被當(dāng)前像素位置減去來找出物體表面位置的前一幀顏色像素。不是當(dāng)前幀的表面的一部分的樣本會(huì)被剔除顾腊。因?yàn)闆]有額外的采樣粤铭,所以對(duì)于暫存抗鋸齒來說幾乎不需要相關(guān)的額外工作。過去幾年行業(yè)內(nèi)常專注于這種類型算法的研究杂靶,一些原因在于延遲渲染并不兼容MASS和其它多重采樣算法梆惯。由于方法的不同,以及應(yīng)用程序使用的不同吗垮,和目標(biāo)的不同垛吗,目前由大量的技術(shù)用來避免人工感問題以及提升質(zhì)量。例如烁登,Wihlidal的報(bào)告怯屉,展示了將EQAA、暫存抗鋸齒和不同的濾波器技術(shù)應(yīng)用到一個(gè)棋盤格采樣模塊會(huì)如何降低像素著色器調(diào)用數(shù)量的同時(shí)保持質(zhì)量饵沧。Iglesias-Guitian等人總結(jié)了之前的工作并展示了他們使用像素歷史和預(yù)測來減少濾波人工錯(cuò)誤的計(jì)劃蚀之。Patney等人擴(kuò)展了Karis和Lottes在虛幻4實(shí)現(xiàn)的TAA工作,用來在虛擬現(xiàn)實(shí)程序上使用捷泞,添加了基于視覺移動(dòng)補(bǔ)償?shù)淖兞看笮〔蓸印?/p>
采樣模式
高效的采樣模式是減少走樣現(xiàn)象的關(guān)鍵元素,使用暫存或其它寿谴。Naiman展示了人眼會(huì)察覺到近水平層處和近垂直層處邊的鋸齒锁右。靠近45度坡度的邊是最容易被看出是否由鋸齒的。旋轉(zhuǎn)網(wǎng)格超級(jí)采樣(RGSS)使用一個(gè)旋轉(zhuǎn)四邊形模式來獲得在水平和垂直方向上更大的分辨率的像素咏瑟。下圖顯示了該圖的例子:
RGSS模式是拉丁超立方或N-rooks采樣的一種組成拂到,其中個(gè)樣本被放置在一個(gè)
的網(wǎng)格中,每個(gè)樣本使用1行1列码泞。通過使用RGSS兄旬,4個(gè)采樣點(diǎn)的每一個(gè)在
的子像素網(wǎng)格的每個(gè)單獨(dú)的行和列上。這樣的模式相比傳統(tǒng)的
采樣模式在捕捉近水平和垂直邊上得到的效果更好余寥,其中這樣的邊會(huì)覆蓋偶數(shù)個(gè)樣本领铐,所以得出更少的效果級(jí)別。
N-rooks是創(chuàng)建一個(gè)好的采樣模式的開始宋舷,但還不足夠绪撵。舉個(gè)例子,樣本會(huì)沿著子像素網(wǎng)格的對(duì)角線排列祝蝠,這樣對(duì)于幾乎平行于這個(gè)對(duì)角線的邊來說會(huì)得到很差的結(jié)果音诈,見下圖:
為了更好的采樣,我們想要避免兩個(gè)采樣點(diǎn)靠近彼此绎狭,我們也想要得到同一的分布细溅,讓樣本覆蓋整個(gè)區(qū)域。為了組成這樣的模式儡嘶,例如拉丁超立方采樣的分層采樣技術(shù)會(huì)與其它類似抖動(dòng)喇聊、霍爾頓序列和泊松盤采樣的技術(shù)結(jié)合在一起。
實(shí)際中GPU架構(gòu)通常硬線連接這樣的采樣模式到硬件中社付,用來進(jìn)行多重采樣抗鋸齒承疲。下圖展示了一些實(shí)際中使用的MSAA模式:
對(duì)于暫存抗鋸齒,平均模式是程序員所期望的鸥咖,其中采樣位置可以幀與幀之間變化燕鸽。舉個(gè)例子,Karis發(fā)現(xiàn)一個(gè)基本的霍爾頓序列比任何GPU提供的MSAA模式工作得要好啼辣。一個(gè)霍爾頓序列在空間中生成采樣點(diǎn)啊研,無序但偏差低,即他們?cè)诳臻g中分布均勻鸥拧,并沒有聚集在一起党远。
當(dāng)一個(gè)子像素網(wǎng)格模式得到一個(gè)三角形如何覆蓋網(wǎng)格得更好的估計(jì)時(shí),它并不是理想的富弦。一個(gè)場景可以由屏幕上多個(gè)任意小的物體組成沟娱,意味著沒有一個(gè)恰當(dāng)?shù)夭蓸勇士梢酝昝赖牟讲蹲剿鼈儭H绻@些微小物體組成一個(gè)模式腕柜,以常量間隔采樣可以得到莫爾條紋或其它干涉模式結(jié)果济似,在超級(jí)采樣中使用網(wǎng)格模式和這個(gè)很像矫废。
一種解決方案是使用隨機(jī)采樣,這能給出一個(gè)更加亂序的模式砰蠢。例如上面的圖中顯示的模式就符合這一點(diǎn)蓖扑。想象以下在遠(yuǎn)處的細(xì)齒梳,少量梳齒覆蓋每個(gè)像素台舱。一個(gè)常規(guī)的模式會(huì)造成嚴(yán)重的偽造感律杠,因?yàn)椴蓸幽J诫S著細(xì)齒梳的頻率相位不斷變化。使用一個(gè)低排序的采樣模式可以打破這些模式竞惋。亂序趨向于使用噪聲來替代重復(fù)的走樣效果柜去,這可以讓人感覺不出來那么嚴(yán)重的偽造感。一個(gè)使用更少架構(gòu)的模式可以幫助緩解問題碰声,但當(dāng)像素級(jí)別重復(fù)時(shí)仍會(huì)出現(xiàn)走樣問題诡蜓。一個(gè)解決方法時(shí)在每個(gè)像素上使用不同的采樣模式,或者隨時(shí)間改變每次采樣的位置胰挑。交錯(cuò)采樣蔓罚,即每個(gè)像素有不同的采樣模式,這一技術(shù)在過去幾十年不定期的在硬件中支持者瞻颂。例如豺谈,ATI的抗失真引擎允許每個(gè)像素有至多16個(gè)采樣點(diǎn),并且有至多16個(gè)不同的用戶定義采樣模式贡这,可以以一種重復(fù)模式進(jìn)行混合茬末。Molnar、Keller和Heidrich盖矫,發(fā)現(xiàn)使用交錯(cuò)隨機(jī)采樣可以在每個(gè)像素使用相同的模式時(shí)減少走樣粗糙感丽惭。
一些其它的GPU支持的算法也值得注意。一種讓采樣點(diǎn)可以影響多于一個(gè)像素的實(shí)時(shí)抗鋸齒方法師英偉達(dá)的過去的五點(diǎn)形方法辈双。五點(diǎn)形即5個(gè)物體的組合责掏,其中4個(gè)位于四邊形上,第5個(gè)位于中心湃望,例如骰子的5點(diǎn)换衬。五點(diǎn)形多重采樣抗鋸齒使用這種模式,將4個(gè)采樣點(diǎn)放置在像素的角上证芭,見下圖:
每個(gè)角采樣點(diǎn)的值貢獻(xiàn)給它的4鄰像素瞳浦。不再讓每個(gè)采樣點(diǎn)的權(quán)重相等,中心的采樣點(diǎn)的權(quán)重設(shè)為1/2废士,每個(gè)角采樣點(diǎn)的權(quán)重為1/8.由于這種采樣點(diǎn)的共享叫潦,每個(gè)像素只需要兩個(gè)采樣點(diǎn)的平均,結(jié)果遠(yuǎn)好于雙采樣的FSAA方法官硝。這種模式近似于一個(gè)2維三角濾波器诅挑,這在之前的小節(jié)談過四敞,比盒狀濾波器高級(jí)。
五點(diǎn)形采樣也可以被用于暫存抗鋸齒拔妥,通過讓每個(gè)像素使用一個(gè)采樣點(diǎn)。每一幀再每個(gè)軸上沿著前一幀偏移半個(gè)像素达箍,偏移方向在幀之間交替没龙。前一幀提供像素角采樣點(diǎn),并且二次線性插值用來快速計(jì)算每個(gè)像素的貢獻(xiàn)缎玫。結(jié)果會(huì)與當(dāng)前幀平均混合硬纤。每幀相同的權(quán)重意味著對(duì)于一個(gè)靜態(tài)場景沒有閃爍偽造感。移動(dòng)物體時(shí)的視覺問題仍然存在赃磨,但這個(gè)方法很容易去用代碼表示筝家,而且當(dāng)每幀的每像素只是用一個(gè)采樣點(diǎn)時(shí)能得到很好的效果。
當(dāng)在單幀中使用時(shí)邻辉,五點(diǎn)形因?yàn)橥ㄟ^采樣點(diǎn)共享而只需要使用兩個(gè)采樣點(diǎn)溪王,所以說開銷少。RGSS模式在近水平和垂直邊上能夠獲得更好的分級(jí)顏色值骇。第一個(gè)對(duì)于移動(dòng)設(shè)備的模式FLIPQUAD莹菱,它結(jié)合了上面這兩種模式的特點(diǎn),它的優(yōu)點(diǎn)是每個(gè)像素只使用兩個(gè)采樣點(diǎn)吱瘩,并且質(zhì)量類似于RGSS(每像素使用了4個(gè)采樣點(diǎn))道伟。這種采樣模式在下圖展示:
類似于五點(diǎn)形,兩個(gè)采樣點(diǎn)的FLIPQUAD模式也可以用于暫存抗鋸齒使碾,并且覆蓋兩幀蜜徽。Drobot的混合重構(gòu)抗鋸齒(HRAA)讓兩采樣點(diǎn)模式表現(xiàn)得更好。棋盤格模式也可以用在暫存抗鋸齒中票摇。El Mansouri討論了使用兩個(gè)采樣點(diǎn)的MSAA來創(chuàng)建棋盤格渲染拘鞋,解決走樣問題的同時(shí)減少著色器開銷。Jimenez使用SMAA兄朋、暫存抗鋸齒和一些不同的技術(shù)來提供一個(gè)解決方案掐禁,用來應(yīng)對(duì)抗鋸齒質(zhì)量會(huì)在渲染引擎加載時(shí)變化的問題。Carpentier和Ishiyama在邊上采樣颅和,旋轉(zhuǎn)采樣網(wǎng)格45°傅事,它們將FXAA和這種暫存抗鋸齒方法來在高分辨率顯示器上進(jìn)行高效的渲染。
形態(tài)學(xué)方法
走樣問題常出現(xiàn)在邊上峡扩,往往來自幾何體蹭越、硬邊緣陰影或高光。利用和走樣出現(xiàn)原因架構(gòu)相關(guān)的知識(shí)可以幫助我們來得到更好的抗鋸齒結(jié)果教届。在2009年响鹃,Reshetov發(fā)表了一種算法驾霜,稱為形態(tài)學(xué)抗鋸齒(MLAA)。形態(tài)學(xué)即和結(jié)構(gòu)或形狀相關(guān)的意思买置。該領(lǐng)域的工作很早就已經(jīng)完成了粪糙,可以追溯到1983年的Bloomenthal。Reshetov的論文重新讓該研究出現(xiàn)在人們眼前忿项,用來代替多重采樣方法蓉冈,強(qiáng)調(diào)搜尋和重構(gòu)邊。
這種抗鋸齒方式是當(dāng)作后期處理來執(zhí)行的轩触,即寞酿,渲染是按照一般的方式完成,然后結(jié)果用來進(jìn)行抗鋸齒處理脱柱。大量的技術(shù)自2009年開始出現(xiàn)伐弹,它們基于額外的緩沖完成,例如深度和法線緩沖榨为,可以得到更好的結(jié)果惨好,例如子像素重構(gòu)抗鋸齒(SRAA),但只適合對(duì)幾何體的邊進(jìn)行抗鋸齒柠逞。分析性方法昧狮,例如幾何緩沖抗鋸齒(GBAA)和邊距抗鋸齒(DEAA),它們讓渲染器計(jì)算一些額外的信息:三角形的邊定位在哪板壮,即邊離中心像素的距離逗鸣。
最常見的模式只需要顏色緩沖骂因,意味著它們也可以提升來自陰影学密、高光或如剪影邊渲染的不同后期處理技術(shù)渲染效果的邊的質(zhì)量完箩,例如刘绣,方向性定位抗鋸齒(DLAA)秽梅,基于一個(gè)理念棠笑,即近垂直邊應(yīng)該進(jìn)行水平模糊销部,同樣缴饭,近水平邊應(yīng)該進(jìn)行垂直模糊硫椰。
高級(jí)的邊緣檢測致力于尋找某一角度邊的像素繁调,并決定它的平均值。在可能邊周圍的像素被進(jìn)行檢測靶草,盡可能地去重構(gòu)出原始邊蹄胰。像素上的邊效果然后可以用來和周圍的像素混合,下圖展示了這一過程:
Iourcha等人通過檢查像素的MSAA采樣點(diǎn)來尋找邊界奕翔,得到比較好的結(jié)果裕寨。注意邊緣預(yù)測和混合相比基于采樣點(diǎn)算法,可以得到更高精度的結(jié)果。例如宾袜,一種使用每像素4個(gè)采樣點(diǎn)的技術(shù)智能得出物體邊的5等級(jí)的混合效果:沒有采樣點(diǎn)覆蓋捻艳、一個(gè)覆蓋、兩個(gè)庆猫、三個(gè)和四個(gè)认轨。預(yù)測邊緣位置的方法可以得到更多的定位,所以也就能給出更好的結(jié)果月培。
對(duì)于基于圖像的算法好渠,如果使用不當(dāng)會(huì)得到不當(dāng)?shù)慕Y(jié)果。首先节视,當(dāng)兩個(gè)物體間的顏色區(qū)別小于算法閾值時(shí)會(huì)無法檢測到邊界。位于三個(gè)或更多可以觀察到的表面重合處的像素會(huì)很難進(jìn)行描述假栓。高對(duì)比度的表面或高頻率的元素寻行,它們的顏色會(huì)在像素間急劇變化,可能會(huì)讓算法錯(cuò)誤識(shí)別邊緣匾荆。特別地拌蜘,當(dāng)使用形態(tài)學(xué)抗鋸齒時(shí),文本的質(zhì)量通常得不到保證牙丽。物體的角也是一個(gè)問題简卧,一些算法可能會(huì)得到圓角效果。對(duì)曲線使用算法時(shí)烤芦,也會(huì)因?yàn)轭A(yù)測為直線而帶來不好的效果举娩。單像素變化會(huì)在邊緣重構(gòu)時(shí)帶來較大的偏移,這樣的話會(huì)造成幀到幀的偽造感构罗。改善這一問題的方法時(shí)使用MSAA掩碼來提高邊緣檢測正確率铜涉。
形態(tài)學(xué)抗鋸齒模式只使用提供的信息。例如遂唧,如果一個(gè)物體比像素還細(xì)芙代,例如電線,這樣屏幕上會(huì)出現(xiàn)溝壑盖彭,因?yàn)槲矬w不太可能恰好覆蓋在像素的中心位置上纹烹。在這種情況下,使用更多的采樣點(diǎn)會(huì)提升質(zhì)量召边,但基于圖像的抗鋸齒單獨(dú)使用就不行铺呵。額外地,執(zhí)行時(shí)間會(huì)基于看到的內(nèi)容而變化掌实,例如陪蜻,觀察一片草地時(shí)抗鋸齒的時(shí)間是觀察天空時(shí)的3倍。
總之贱鼻,基于圖像的方法可以為現(xiàn)代內(nèi)存提供抗鋸齒支持宴卖,并且消耗較少滋将,所以它們被許多應(yīng)用程序采用。只有顏色的方法可以從渲染管線中分離出來症昏,讓它們便于修改或禁用随闽,甚至可以作為GPU驅(qū)動(dòng)選項(xiàng)暴露出來。最受歡迎的兩種算法是快速近似抗鋸齒(FXAA)肝谭,和子像素形態(tài)學(xué)抗鋸齒(SMAA)掘宪,某種程度上是因?yàn)閮煞N方法對(duì)多種機(jī)器都提供了開源代碼實(shí)現(xiàn)。兩種算法只是用顏色輸入攘烛,同時(shí)SMAA的優(yōu)點(diǎn)在于可以使用MSAA采樣點(diǎn)魏滚。每種方法有它自己的不同的可獲得的設(shè)置,在速度和質(zhì)量間權(quán)衡坟漱。開銷通常是每幀在1至2毫秒鼠次,這通常是電子游戲所消耗的時(shí)間。最后芋齿,兩種算法都有暫存抗鋸齒的優(yōu)點(diǎn)腥寇。Jimenez發(fā)表了一種SMAA的優(yōu)化實(shí)現(xiàn),快于FXAA觅捆,并且描述了一種暫存抗鋸齒的模式赦役。
透明、透明度和合成
有多種方法能讓光穿過半透明物體栅炒。對(duì)于渲染算法掂摔,它們可以被粗略地分為基于燈光的和基于觀察的效果≈案ǎ基于燈光的效果即物體會(huì)讓燈光衰減或分散棒呛,照亮其它物體,渲染出不一樣的效果域携〈孛耄基于觀察的效果是渲染半透明物體。
在這一節(jié)我們會(huì)介紹最簡單的基于觀察的透明的組成秀鞭,即半透明物體會(huì)顯示后面物體的衰減顏色趋观。更高級(jí)的基于觀察和燈光的效果,例如磨砂玻璃锋边,光的彎曲皱坛,由于透明物體的厚度產(chǎn)生的光的衰減,以及觀察角度的變化帶來的反射會(huì)穿透效果的變化豆巨,這些效果會(huì)在之后的章節(jié)講解剩辟。
一種給出透明度光照的方法是紗門透明度,該方法的理念是使用一個(gè)與像素對(duì)齊的棋盤格填充模式來渲染透明三角形,即每隔一個(gè)三角形像素被渲染后贩猎,從而讓其后的物體部分可見熊户。通常屏幕上的像素挨得足夠近,棋盤格本身不可見吭服。該方法主要的缺點(diǎn)是通常只有一個(gè)透明物體可以被渲染在屏幕上的對(duì)應(yīng)區(qū)域內(nèi)嚷堡。例如,如果一個(gè)透明紅色物體和一個(gè)透明綠色物體在一個(gè)藍(lán)色物體上渲染艇棕,在棋盤格模式上只有三種顏色中的兩種可以顯示蝌戒。同時(shí),50%的棋盤格限制大沼琉。其它更大的的像素掩碼可以被用來給定其它的百分比北苟,但這會(huì)創(chuàng)建出容易察覺的模式。
也就是說打瘪,該技術(shù)的一個(gè)優(yōu)點(diǎn)就是它的簡單性粹淋。透明物體會(huì)在任何時(shí)候被渲染,以任何的順序瑟慈,并且不需要任何的特殊硬件。解決透明度問題有一個(gè)方法屋匕,是將所有物體覆蓋的像素變得不透明葛碧。同樣的理念用于抗鋸齒剪貼紋理的邊中,但在一個(gè)子像素的級(jí)別上过吻,使用一個(gè)稱為alpha平均的特性进泼。
Enderton等人提出了隨機(jī)半透明的的方法,使用子像素紗門掩碼結(jié)合隨機(jī)采樣纤虽。一張通過使用隨機(jī)網(wǎng)點(diǎn)模式來顯示透明度片段混合的圖片顯示如下:
對(duì)于這種模式乳绕,每個(gè)像素必須要使用大量的采樣點(diǎn)洋措,這樣才能讓結(jié)果看起來可信菠发,同時(shí)對(duì)所有的子像素采樣點(diǎn)需要相當(dāng)數(shù)量的內(nèi)存滓鸠。該方法比較吸引人的是不需要進(jìn)行混合,同時(shí)抗鋸齒悠抹、透明度和其它創(chuàng)建部分覆蓋像素的效果只需要單一機(jī)制就可以實(shí)現(xiàn)锌钮。
大多數(shù)的透明度算法會(huì)混合在其后物體的顏色梁丘,為此氛谜,就需要透明度混合的概念澳腹。當(dāng)一個(gè)物體渲染在屏幕上時(shí)酱塔,每個(gè)像素會(huì)綁定一個(gè)RGB顏色和一個(gè)深度值羊娃。額外的組件蕊玷,稱為alpha(),可以對(duì)覆蓋物體的像素頂?shù)酌吵稀lpha是一個(gè)形容不透明度的值赦颇,是一個(gè)對(duì)于給定像素的物體片段的覆蓋程度媒怯。Alpha值為1.0意味著物體時(shí)不透明的欺殿,完全覆蓋像素的感興趣區(qū)域脖苏,0.0意味著像素完全不可見棍潘,機(jī)片段是完全透明的。
一個(gè)像素的alpha值可以代表不透明度或覆蓋程度肴楷,或者兩者都可以赛蔫,取決于使用情況呵恢。舉個(gè)例子瑰剃,一個(gè)肥皂泡的邊可能覆蓋像素的3/4,0.75歇竟,可能會(huì)是幾乎透明的,讓90%的光線進(jìn)入眼睛盅安,所以它是0.1不透明度的,它的alpha值可以是蝙寨。然而墙歪,如果我們使用MSAA或類似的抗鋸齒模式靠胜,覆蓋情況可能會(huì)被采樣點(diǎn)自身考慮在內(nèi)。3/4的采樣點(diǎn)會(huì)被肥皂泡影響郑藏,每個(gè)采樣點(diǎn)我們會(huì)將0.1不透明度作為alpha值必盖。
混合順序
為了讓物體渲染為透明狀,它需要渲染在已有的場景上面,同時(shí)alpha值設(shè)為小于1的值嬉探。每個(gè)被物體覆蓋的像素會(huì)從像素著色器獲得RGBA顏色值。將該片段的值和原始像素的顏色混合通常使用覆蓋操作胎围,即:
其中是透明物體的顏色,可稱為源顏色上岗,
是物體的alpha值逞姿,
是混合前的像素顏色续室,可稱為目標(biāo)顏色,
是透明物體覆蓋已存在場景的結(jié)果顏色丰泊。在渲染管線中,傳入
和
,接著會(huì)用計(jì)算的結(jié)果顏色替換元數(shù)像素顏色
盏浇。如果傳入的RGBA的不透明度值為1.0,該等式就會(huì)簡化為物體顏色直接替換像素顏色童擎。
例子:一個(gè)紅色的半透明物體在一個(gè)藍(lán)色地面上渲染。假設(shè)物體的RGB值為班挖,藍(lán)色地板為
,物體的不透明度為0.6,那么這兩個(gè)顏色混合為:
會(huì)得到一個(gè)顏色
覆蓋操作會(huì)給要渲染物體一個(gè)半透明效果碴萧。這種方式完成的透明度起了效果,一種透過物體看到后面物體的感覺破喻。使用覆蓋模擬了一種真實(shí)世界中的薄布料效果婴噩。在該布料后的物體的表現(xiàn)為部分可見——布料的線是不透明的章蚣。實(shí)際中峭沦,寬松的布料有一種覆蓋全角度的alpha平均效果蓬豁。這里的要點(diǎn)是alpha模擬了材質(zhì)覆蓋像素的程度。
覆蓋操作在模擬其它透明效果時(shí)不太可信,尤其是觀察有顏色的玻璃或塑料時(shí)〕卵疲現(xiàn)實(shí)世界中一個(gè)在藍(lán)色物體前的紅色過濾器通常會(huì)讓藍(lán)色物體看起來更暗界酒,因?yàn)樵撨^濾器反射了一些穿過的光。見下圖:
當(dāng)覆蓋操作用于混合時(shí)逝淹,結(jié)果是部分紅色和藍(lán)色相加在一起规脸。如果將兩顏色相乘效果會(huì)更好,同時(shí)添加所有被透明物體反射掉的光。這種物理透光效果在之后的章節(jié)講解瞄崇。
作為混合的基本操作凿掂,覆蓋操作是透明效果最常使用的。另一個(gè)有時(shí)使用的操作是相加混合切黔,像素值被簡單地疊加:
這種混合模式可以較好地實(shí)現(xiàn)輝光效果瞳抓,例如閃電或火花這些不會(huì)衰減像素值,只是增亮的效果闻鉴。然而,這個(gè)模式在透明效果上實(shí)現(xiàn)得并不好,不透明表面看起來并不通透骗爆。對(duì)于一些多層的半透明表面,例如煙霧或火焰挑童,相加混合會(huì)增加效果顏色的飽和度第练。
為了正確地渲染透明物體,我們需要在繪制完不透明物體后再渲染岗屏。這通過先關(guān)閉混合渲染所有不透明物體率碾,然后打開覆蓋操作渲染透明物體蟹但。理論上我們可以一直讓覆蓋操作開啟兼搏,因?yàn)?.0不透明alpha值會(huì)給出源顏色泛范,并隱藏目標(biāo)顏色笼才,但這么做開銷較大,并且沒有實(shí)際的用處骡送。
深度緩沖的限制是只有一個(gè)物體會(huì)逐像素存儲(chǔ)昂羡。如果一些透明物體重合了部分像素,深度緩沖本身就很難對(duì)所有可見物體進(jìn)行處理摔踱。當(dāng)在給定像素使用覆蓋透明表面時(shí)虐先,通常需要按照從后往前的順序渲染。如果不這么做的話就會(huì)得到不正確的視覺效果派敷。一種實(shí)現(xiàn)這種順序的方法是逐一對(duì)物體進(jìn)行排序蛹批,按照它們的中心沿觀察方向的距離。這種粗略地排序能得到不錯(cuò)的結(jié)果篮愉,但存在許多潛在地問題腐芍。首先,這個(gè)順序只是粗略的试躏,所以判斷為遠(yuǎn)處地物體實(shí)際上可能在判斷為近處地物體前甸赃。同時(shí)交錯(cuò)大的物體時(shí)不可能對(duì)所有觀察角度進(jìn)行逐網(wǎng)格的分解的,很難將網(wǎng)格分離為一小片冗酿。見下圖左側(cè):
甚至有凹面的網(wǎng)格也會(huì)出現(xiàn)排序錯(cuò)誤問題埠对,比如當(dāng)它與屏幕重合時(shí)。
盡管如此裁替,由于該方法的簡單和快捷项玛,同時(shí)不需要額外的內(nèi)存或特殊的GPU支持,這種粗略的透明度排序還是經(jīng)常使用弱判。如果要實(shí)現(xiàn)的話襟沮,通常最好在渲染透明物體時(shí)關(guān)閉深度緩沖替換操作,即深度測試仍進(jìn)行昌腰,但測試通過的表面不改變存儲(chǔ)在深度緩沖中的值开伏,最近的不透明表面的深度值仍完全保留。使用這種方法的話遭商,所有的透明物體至少會(huì)以某種形式顯示固灵,與之對(duì)應(yīng)的是當(dāng)旋轉(zhuǎn)攝像機(jī)時(shí)改變排序而讓透明物體突然出現(xiàn)或消失。其它的技術(shù)可以幫助改善效果劫流,例如繪制每個(gè)透明網(wǎng)格兩次巫玻,首先渲染背面丛忆,然后是正面。
覆蓋操作也可以被修改仍秤,從前往后混合也可以得到相同的效果熄诡,這種混合模式為疊底操作:
注意疊底操作要求目標(biāo)顏色的alpha值,覆蓋操作不需要诗力。換句話說凰浮,目標(biāo)——即較近的透明表面與下方的表面混合,正因?yàn)槭遣煌该鞯奈荆砸笠粋€(gè)alpha值袜茧。疊底的公式類似于覆蓋,只是交換了源顏色和目標(biāo)顏色圈澈。同樣,注意計(jì)算alpha的公式仍是要求順序的尘惧,因此源顏色和目標(biāo)顏色的alpha值才能被交換康栈,結(jié)果的alpha值保持不變。
alpha值的等式來源于對(duì)片段alpha值覆蓋的考慮喷橙。Proter和Duff注意到由于我們不知道每個(gè)片段覆蓋區(qū)域的形狀啥么,我們可以假設(shè)每個(gè)片段根據(jù)alpha值部分覆蓋片段,例如贰逾,如果悬荣,像素會(huì)以某種方式分為兩個(gè)區(qū)域,0.7部分會(huì)被源片段覆蓋疙剑,0.3部分不會(huì)氯迂。不考慮其他情況,目標(biāo)顏色的片段覆蓋言缤,假設(shè)
嚼蚀,會(huì)與源片段部分重疊。該公式有一個(gè)幾何解釋管挟,見下圖:
與順序無關(guān)的透明
疊底操作是將所有透明物體渲染進(jìn)獨(dú)立的顏色緩沖中轿曙,然后將該顏色緩沖疊在不透明場景上,使用覆蓋操作僻孝。另一個(gè)疊底操作的使用是用來執(zhí)行一個(gè)順序無關(guān)的透明算法(OIT)导帝,常被稱為深度剝離。渲染無關(guān)意味著應(yīng)用程序不需要執(zhí)行排序穿铆。深度剝離的理念是是使用兩個(gè)深度緩沖和多個(gè)渲染過程您单。首先,第一個(gè)渲染過程由所有表面的深度值構(gòu)成荞雏,包括透明表面的深度值睹限,存儲(chǔ)在第一個(gè)深度緩沖譬猫。在第二個(gè)渲染過程中,所有的透明物體被渲染羡疗。如果一個(gè)物體的深度值匹配第一個(gè)深度緩沖中的值染服,我們就可以知道這個(gè)是最近的透明物體,然后將其的RGBA值存儲(chǔ)進(jìn)一個(gè)獨(dú)立的顏色緩沖叨恨。我們同樣將透明物體的深度值從該層剝離開柳刮,如果存在的話,它就在第一個(gè)深度值后痒钝,也是最近的秉颗。該深度值是第二近的透明物體的距離。接下來的過程繼續(xù)使用疊底操作剝離和添加透明層送矩,在幾個(gè)過程后我們停下蚕甥,然后在不透明物體圖像上混合透明物體圖像。見下圖:
該方法的一些變體也被提出栋荸。例如菇怀,Thibieroz給出了一個(gè)從后往前實(shí)現(xiàn)的算法,它有著可以立即混合透明值得優(yōu)點(diǎn)晌块,意味著不再需要獨(dú)立得alpha通道爱沟。深度剝離的一個(gè)問題是需要得知對(duì)于捕捉所有的透明層,花費(fèi)多少的渲染過程是足夠的匆背。一個(gè)硬件方案是提供一個(gè)像素繪制計(jì)數(shù)器呼伸,這告訴我們?cè)阡秩酒陂g有多少像素被寫入。當(dāng)一個(gè)過程沒有渲染像素時(shí)钝尸,渲染就結(jié)束了括享。使用疊底操作的優(yōu)點(diǎn)是最重要的透明層,這些眼睛最先觀察到的珍促,是最早被渲染的奶浦。每個(gè)透明表面總是增加它所覆蓋的像素的alpha值。如果一個(gè)像素的alpha值接近1.0踢星,對(duì)像素的混合操作會(huì)讓其接近不透明澳叉,因此更多的遠(yuǎn)處物體會(huì)由一個(gè)很難察覺的透明效果。從前往后的剝離會(huì)減少沐悦,當(dāng)被一個(gè)過程渲染的像素?cái)?shù)量小于某一最小值時(shí)成洗,或者配置一個(gè)固定數(shù)量的過程。這些方法沒法和從后往前的剝離相比藏否,因?yàn)樽罱膶油亲詈罄L制的瓶殃,所以可能會(huì)丟失一些信息導(dǎo)致提前失敗。
深度剝離是很有效的副签,不過在每個(gè)獨(dú)立的渲染過程逐一分離所有的透明物體時(shí)遥椿,會(huì)變得很慢基矮。Bavoil和Myers提出了雙深度剝離,其中最近和最遠(yuǎn)的深度剝離層會(huì)在每個(gè)渲染過程中被剝離冠场,這樣會(huì)讓渲染過程的數(shù)量縮減為原來的一半家浇。Liu等人發(fā)現(xiàn)一個(gè)了桶排序,可以在單個(gè)渲染過程中至多捕捉到32個(gè)層碴裙。這種類型方法的一個(gè)缺點(diǎn)是需要相當(dāng)數(shù)量的內(nèi)存來對(duì)所有的層排序钢悲。通過MSAA的抗鋸齒或類似的方法會(huì)極大地增加開銷。
以一種交互的比率將透明物體恰當(dāng)混合的問題并不是缺少算法舔株,而是要將這些算法有效率地映射到GPU上莺琳。在1984年,Carpenter提出了A緩沖载慈,是多重采樣的另一種形式惭等。在A緩沖中,每個(gè)渲染的三角形會(huì)對(duì)每個(gè)屏幕網(wǎng)格單元?jiǎng)?chuàng)建一個(gè)覆蓋掩碼办铡,完全覆蓋或部分覆蓋辞做。每個(gè)像素存儲(chǔ)所有相關(guān)片段的列表。不透明片段可以丟棄在其后的片段料扰,類似于Z緩沖凭豪。所有的片段都是為透明表面存儲(chǔ)的焙蹭。一旦所有的列表構(gòu)成了晒杈,會(huì)通過遍歷所有的片段并處理每個(gè)采樣點(diǎn)來得到最終的結(jié)果。
在GPU上創(chuàng)建鏈接片段列表的理念在DirectX11的新功能上得以體現(xiàn)孔厉。使用的特性包括無序訪問試圖(UAVs)和原子操作拯钻。使用MSAA的抗鋸齒通過訪問覆蓋驗(yàn)碼得能力開啟,并在每個(gè)采樣點(diǎn)上使用像素著色器撰豺。這個(gè)算法通過光柵化每個(gè)透明表面和在一個(gè)長數(shù)組中插入生成的片段來實(shí)現(xiàn)粪般。結(jié)合顏色和深度值,會(huì)生成一個(gè)獨(dú)立指針結(jié)構(gòu)污桦,它會(huì)為每個(gè)像素鏈接當(dāng)前片段和前一個(gè)片段亩歹。一個(gè)獨(dú)立的渲染過程接著被執(zhí)行,其中一個(gè)充滿屏幕的四邊形被渲染凡橱,這樣在每個(gè)像素上調(diào)用像素著色器小作。這個(gè)著色器會(huì)使用接下來的鏈接搜尋每個(gè)像素上的不透明的片段。每個(gè)搜尋到的片段會(huì)和之前的片段一起按順序排序稼钩。因?yàn)榛旌喜僮魇怯上袼刂鲗?shí)現(xiàn)的顾稀,每個(gè)像素可以使用不同的混合模式。隨著GPU和API的不斷發(fā)展坝撑,已經(jīng)通過減少原子操作的消耗來提升了性能静秆。
A緩沖的優(yōu)勢(shì)是只會(huì)存儲(chǔ)每個(gè)像素需要的片段粮揉,因?yàn)閷?shí)在GPU上實(shí)現(xiàn)的鏈接列表。但這也會(huì)成為一個(gè)缺點(diǎn)抚笔,因?yàn)樾枰拇鎯?chǔ)空間大小在渲染前是不得而知的扶认。有毛發(fā)、煙霧或其它有可能重疊透明表面的效果的場景塔沃,會(huì)產(chǎn)生大量的片段蝠引。Andersson提出,對(duì)于復(fù)雜的游戲場景蛀柴,多達(dá)50個(gè)的透明網(wǎng)格螃概,例如葉子,以及多大200個(gè)的半透明粒子可能會(huì)重疊
GPU上通常由許多內(nèi)存資源鸽疾,例如緩沖和數(shù)組會(huì)提前存儲(chǔ)吊洼,鏈接列表方法也不例外。用戶需要決定多少內(nèi)存是足夠的制肮,用盡內(nèi)存會(huì)造成可見的偽造感冒窍。Salvi和Vaidyanathan提出一個(gè)方法來解決這一問題,稱為多層alpha混合豺鼻,使用了因特爾的像素同步的GPU特性综液。見下圖:
這種能力提供了一種可編程混合,使用的開銷比原子操作少儒飒。他們的方法會(huì)重新組成存儲(chǔ)和混合谬莹,這樣就可以很好地在內(nèi)存耗盡時(shí)減少內(nèi)存。一個(gè)粗略的排序順序可以優(yōu)化他們的方法桩了。DirectX11.3介紹了一種光柵器順序視圖附帽,這是一種允許透明方法在所有支持該特性的GPU上實(shí)現(xiàn)的緩沖。移動(dòng)設(shè)備有著類似的技術(shù)井誉,稱為拼貼本地存儲(chǔ)蕉扮,允許他們實(shí)現(xiàn)多層alpha混合。這種結(jié)構(gòu)的性能不錯(cuò)颗圣,然而喳钟,也就意味算法的開銷會(huì)很大。
有種方法基于k緩沖的理論在岂,由Bavoil等人提出奔则,其中首次少量可見的層被保存并盡量存儲(chǔ)盡可能起來,同時(shí)丟棄和結(jié)合深層的層洁段。Maule等人使用k緩沖应狱,并且使用權(quán)重覆蓋來解釋這些遠(yuǎn)一些層。按權(quán)重的累加和按權(quán)重平均透明度的技術(shù)是與順序無關(guān)的祠丝,可以在單個(gè)渲染過程中完成疾呻,可以在幾乎所有的GPU上運(yùn)行除嘹。問題在于它們并沒有考慮物體的順序。所以岸蜗,舉個(gè)例子尉咕,使用alpha來代表覆蓋程度,一個(gè)紅色薄紗圍巾位于薄紗藍(lán)色圍巾上璃岳,會(huì)呈現(xiàn)紫色笋鄙,反之亦然掉弛。當(dāng)接近不透明的物體得到很弱的結(jié)果時(shí)拜马,這一類的才發(fā)對(duì)于高透明度表面和粒子的視覺表現(xiàn)會(huì)很有用展姐,見下圖:
按權(quán)重累加的透明度公式為:
其中n是透明表面的數(shù)量,和
代表透明度值犁柜,
是場景中不透明部分的顏色洲鸠。兩個(gè)和累積在一起,在透明表面渲染時(shí)會(huì)分離存儲(chǔ)馋缅,在透明渲染過程的最后扒腕,每個(gè)像素都會(huì)調(diào)用該等式。這種方法的問題在于第一個(gè)累加和飽和了萤悴,即生成的顏色值會(huì)高于
瘾腰,背景顏色會(huì)有反相效果,因?yàn)閍lpha的值會(huì)高于1.0覆履。
按權(quán)重平均通常是我們想要的方式蹋盆,因?yàn)樗苊饬诉@些問題:
第一行代表兩個(gè)在透明渲染過程中生成的獨(dú)立緩沖中的結(jié)果,每個(gè)表面會(huì)使用其alpha值進(jìn)行權(quán)重和内狗。近乎不透明的表面貢獻(xiàn)的顏色更多怪嫌,接近透明的表面影響較小义锥。通過使用除以
我們可以得到一個(gè)權(quán)重平均透明顏色柳沙。
值是所有alpha值的平均。值
只在平均alpha值n次后目標(biāo)顏色的可見性估計(jì)拌倍。最后一行是一個(gè)覆蓋操作赂鲤,
代表源顏色alpha值。
使用權(quán)重平均的一個(gè)限制是柱恤,對(duì)于相同的alpha值数初,它會(huì)同等地進(jìn)行顏色混合,不考慮順序梗顺。McGuire和Bavoil介紹了按權(quán)重混合的順序無關(guān)透明度方法來給出更可信的結(jié)果泡孩。在他們的公式中,到表面的距離同樣影響權(quán)重寺谤,較近的表面影響更大仑鸥,同樣吮播,不再平均alpha值,值是通過與$(1-\alpha_i)部分相乘同時(shí)從一減去計(jì)算得到的眼俊,得到了真正的表面alpha值的平均意狠。該方法得到的結(jié)果在下圖顯示:
缺點(diǎn)在于,在一個(gè)大的場景中疮胖,物體彼此靠近的話环戈,從距離上看,物體會(huì)有幾乎相同的權(quán)重澎灸,這會(huì)讓結(jié)果相比權(quán)重平均來說有一些不同院塞。同樣,當(dāng)攝像機(jī)到透明物體的距離改變了性昭,深度權(quán)重實(shí)際上也會(huì)變化迫悠,但變化是逐級(jí)的。
McGuire和Mara拓展了這個(gè)方法巩梢,包含了一個(gè)看似可信的穿透顏色效果创泄。在之前提到過,所有本節(jié)討論的透明算法是混合不同顏色括蝠,而不是過濾它們鞠抑,來模仿像素平均。為了得到一個(gè)顏色過濾效果忌警,不透明場景會(huì)被像素著色器讀取搁拙,并且每個(gè)透明表面與覆蓋像素顏色相乘,將結(jié)果存儲(chǔ)在第三個(gè)緩沖中法绵。這個(gè)緩沖中箕速,不透明物體被透明物體染色,然后這個(gè)緩沖會(huì)在處理透明緩沖時(shí)替代不透明場景朋譬。這個(gè)方法能成功的原因是盐茎,不同于覆蓋的透明,顏色穿透是與順序無關(guān)的徙赢。
目前為止還有一些其它的算法字柠,使用我們目前介紹過的技術(shù)中的一部分元素。例如狡赐,Wyman通過內(nèi)存要求窑业、插入和幾何方法、alpha值或幾何覆蓋是否被使用以及片段是否被丟棄來將之前的相關(guān)工作進(jìn)行了分類枕屉。他通過尋找之前研究的不足指出提出了兩種新的方法常柄。他的隨機(jī)層alpha混合方法使用了k緩沖,按權(quán)重平均和隨機(jī)透明度。他的其它算法是Salvi和Vaidyanathan的方法的一種變體西潘,使用覆蓋掩碼替代alpha值铜异。
雖然有大量的方法來應(yīng)對(duì)透明度問題,但并沒有一個(gè)完美的解決方案秸架。我們推薦感興趣的讀者看一下Wyman的論文和Maule等人的更細(xì)節(jié)的關(guān)于交錯(cuò)透明度算法的調(diào)查揍庄。
預(yù)乘Alpha和合成
覆蓋操作也用于混合圖片或合成的渲染物體。這個(gè)過程被稱為合成东抹。在這種情況下蚂子,每個(gè)像素的alpha值和RGB值一起存儲(chǔ)在物體中。由alpha通道構(gòu)成的圖像有時(shí)被稱為遮罩缭黔,它顯示了物體的剪影形狀食茎。這個(gè)RGBA圖像可以用來和類似的元素或背景混合。
一種使用合成RGBA數(shù)據(jù)的方法是使用預(yù)乘alpha馏谨,即RGB值在使用前會(huì)與alpha值相乘别渔,這可以讓合成覆蓋操作更有效率:
其中是預(yù)乘源通道。預(yù)乘的alpha值可以不需要改變混合狀態(tài)來使用覆蓋操作和相加操作惧互,因?yàn)樵搭伾珪?huì)在混合期間加上哎媚。注意,使用預(yù)乘RGBA值喊儡,RGB組件通常不會(huì)大于alpha值拨与,盡管它們可以用來創(chuàng)建過亮的半透明值。
渲染合成圖片可以非常自然地和預(yù)乘alpha相結(jié)合艾猜。一個(gè)抗鋸齒的不透明物體渲染在一個(gè)黑色背景上的話买喧,會(huì)默認(rèn)提供預(yù)乘值。假設(shè)一個(gè)白色三角形沿邊覆蓋某些像素的40%匆赃,通過使用抗鋸齒淤毛,像素值可能會(huì)被設(shè)為0.4,即我們會(huì)為這個(gè)像素存儲(chǔ)的值算柳。如果要存儲(chǔ)alpha值的話低淡,就會(huì)是0.4。RGBA值就會(huì)是
埠居,這是一個(gè)預(yù)乘值查牌。
另一個(gè)存儲(chǔ)圖片的方式是使用非乘alpha值事期,或者稱為非預(yù)乘alpha滥壕,即RGB值不會(huì)和alpha值相乘。對(duì)于白色三角形的粒子兽泣,非乘顏色會(huì)被設(shè)為绎橘。這種表示方法的優(yōu)點(diǎn)是會(huì)保留三角形的原始顏色,但在顯示前需要和存儲(chǔ)的alpha值相乘。最好在進(jìn)行過濾和混合操作時(shí)使用預(yù)乘值称鳞,因?yàn)槔缇€性插值的操作使用非乘alpha值的話會(huì)不正確涮较,例如黑邊的偽造感也會(huì)出現(xiàn)。
對(duì)于圖像操作應(yīng)用程序冈止,在使用不影響底層的原始圖片數(shù)據(jù)的圖像遮罩時(shí)使用非乘alpha值會(huì)很有用狂票。同時(shí),一個(gè)非乘alpha值意味著可以使用高精度范圍的顏色通道熙暴,即便如此闺属,在非乘RBGA值和線性空間顏色值之間進(jìn)行轉(zhuǎn)化時(shí)還是要多加注意。例如周霉,沒有瀏覽器能夠恰當(dāng)?shù)刈龅竭@一點(diǎn)掂器。支持alpha值得圖像格式包括PNG(只支持非乘alpha值),OpenEXR(只支持預(yù)乘alpha值)俱箱、TIFF(兩種都支持)国瓮。
一種與alpha通道相關(guān)得概念時(shí)色度鍵控。這是影視領(lǐng)域的術(shù)語狞谱,即演員在綠幕或藍(lán)幕背景前演出乃摹,之后進(jìn)行合成「疲基本理念是一個(gè)特定顏色的色相或精確的顏色值被設(shè)計(jì)用來代表透明峡懈。這允許圖片可以只通過RGB值來給出外輪廓形狀,不需要存儲(chǔ)alpha值与斤。該方法的一個(gè)缺點(diǎn)是物體在某一像素上要么是不透明要么是透明的肪康,即alpha值只有1.0或0.0。
顯示編碼
當(dāng)計(jì)算光照撩穿、紋理或其它操作時(shí)磷支,值通常假設(shè)是線性的。這樣的話食寡,意味著加操作和乘操作可以按預(yù)期實(shí)現(xiàn)雾狈。然而,為了避免不同的視覺偽造感抵皱,我們必須將顯示緩沖和紋理使用的非線性編碼考慮在內(nèi)善榛。粗略地來說就是:著色器輸出顏色范圍在內(nèi),我們將其通過使用
來提升呻畸,這一操作稱為伽馬矯正移盆,對(duì)輸入的紋理和顏色執(zhí)行相反的操作。在大多數(shù)情況下我們可以讓GPU執(zhí)行這一操作伤为。
我們先介紹陰極射線管(CRT)咒循。在早些年顯示數(shù)字圖像時(shí),常使用CRT。這些設(shè)備在輸入電壓和顯示輻射率間有一個(gè)冪關(guān)系叙甸。當(dāng)賦予一個(gè)像素的能量等級(jí)上升時(shí)颖医,發(fā)出的輻射率并不是線性增長的,而是按照指數(shù)大于1的冪函數(shù)增長裆蒸。例如熔萧,假設(shè)指數(shù)為2,當(dāng)一個(gè)像素值為1.0時(shí)僚祷,一個(gè)設(shè)為50%的像素會(huì)發(fā)出1/4的光哪痰,。盡管LCDS和其它顯示技術(shù)有不同于CRT的固有色調(diào)曲線久妆,它們有一些間接轉(zhuǎn)換來模仿CRT的顯示晌杰。
這個(gè)冪函數(shù)恰好與人的對(duì)光視覺感知相反。這種巧合的結(jié)果讓編碼粗略的稱為視覺同意筷弦。即肋演,在編碼值為N和N+1之間的可察覺到的差距在顯示范圍上基本為常量。使用閾值對(duì)比度測量烂琴,我們可以在大范圍的情況下檢測到亮度的1%差距爹殊。這種接近最佳的值分布降低了條帶偽造感,當(dāng)顏色存儲(chǔ)在精度限制的顯示緩沖中奸绷。同樣的效果也可以作用于紋理梗夸,通常使用同樣的編碼。
顯示轉(zhuǎn)移函數(shù)描述了在顯示緩沖中的數(shù)字值和顯示發(fā)出的輻射率級(jí)別之間的關(guān)系号醉。因?yàn)檫@個(gè)原因反症,它也被稱為電子光學(xué)轉(zhuǎn)移函數(shù)(EOTF)。顯示轉(zhuǎn)移函數(shù)是硬件的一部分畔派,對(duì)于不同的電腦顯示器铅碍、電視和投影儀有不同的標(biāo)準(zhǔn)。對(duì)于整個(gè)過程的另一端线椰,如圖片和視頻拍攝設(shè)備來說也有一個(gè)標(biāo)準(zhǔn)轉(zhuǎn)移函數(shù)胞谈,被稱為光學(xué)電子轉(zhuǎn)移函數(shù)(OETF)。
當(dāng)在顯示時(shí)進(jìn)行線性顏色值編碼時(shí)憨愉,我們的目標(biāo)是抵消顯示轉(zhuǎn)移函數(shù)的效果烦绳,這樣的話無論我們?cè)趺从?jì)算的值都會(huì)得到相對(duì)應(yīng)的輻射率等級(jí)。例如配紫,如果我們計(jì)算的值是兩倍的径密,那么輸出的輻射率也想是兩倍的。為了保持這種連接笨蚁,我們使用顯示轉(zhuǎn)移函數(shù)的逆來抵消它的非線性效果睹晒。這種無效化顯示響應(yīng)曲線的過程也被稱為伽馬矯正趟庄。當(dāng)解碼紋理值時(shí)括细,我們需要應(yīng)用顯示轉(zhuǎn)移函數(shù)來生成在著色中使用的線性值伪很。下圖展示了這種解碼和編碼的過程:
個(gè)人電腦顯示使用的標(biāo)準(zhǔn)轉(zhuǎn)移函數(shù)由一個(gè)特殊的顏色空間定義,即sRGB奋单。大多數(shù)的控制GPU的API可以設(shè)置為自動(dòng)地應(yīng)用合適地sRGB轉(zhuǎn)換锉试,當(dāng)值從紋理中讀取時(shí)或?qū)懭腩伾彌_時(shí)。之后的章節(jié)會(huì)講到览濒,mipmap生成也會(huì)將sRGB編碼考慮在內(nèi)呆盖。沿紋理值雙線性插值會(huì)得到正確的結(jié)果,首先轉(zhuǎn)換到線性值然后執(zhí)行插值贷笛。alpha混合通過解碼存儲(chǔ)的值到線性值來得到正確結(jié)果应又,和新值混合,然后編碼結(jié)果乏苦。
在渲染的最終階段應(yīng)用轉(zhuǎn)換是非常重要的株扛,當(dāng)值是寫入幀緩沖來顯示時(shí)。如果后期處理是在顯示編碼后應(yīng)用的話汇荐,這些效果就會(huì)使用非線性值計(jì)算洞就,這通常是不正確的效果。顯示編碼可以認(rèn)為是壓縮的一種組成掀淘,是一種能夠最好保持住值的感知效果的組成旬蟋。一種理解方式是我們是使用線性值來進(jìn)行物理計(jì)算,當(dāng)我們想要顯示結(jié)果或獲得顯示紋理圖像時(shí)革娄,我們就需要移動(dòng)數(shù)據(jù)到顯示編碼形式倾贰,或者從顯示編碼形式移動(dòng)回來,使用恰當(dāng)?shù)木幋a或解碼轉(zhuǎn)換拦惋。
如果我們需要手動(dòng)應(yīng)用sRGB躁染,我們可以使用一個(gè)簡單的轉(zhuǎn)換公式。實(shí)際中架忌,顯示是通過每個(gè)顏色通道使用多比特值來表示的吞彤,例如消費(fèi)級(jí)顯示器是8,顏色范圍是叹放。這里我們將顯示編碼的等級(jí)簡化為
饰恕,忽略比特?cái)?shù)。線性值也可以位于
的范圍井仰,以浮點(diǎn)數(shù)的形式埋嵌。我們將線性值標(biāo)記為x,存儲(chǔ)在幀緩沖中的非線性值的標(biāo)記為y俱恶。為了將線性值轉(zhuǎn)換到sRGB的非線性編碼值雹嗦,我們應(yīng)用sRGB的顯示轉(zhuǎn)移函數(shù)的逆:
x代表RGB線性元組的一個(gè)通道范舀。這個(gè)等式應(yīng)用于每個(gè)通道,這些生成的三個(gè)值進(jìn)行顯示了罪。在手動(dòng)應(yīng)用轉(zhuǎn)換函數(shù)的時(shí)候要小心锭环。一種錯(cuò)誤來源是使用了編碼顏色代替線性顯示,另一種錯(cuò)誤是解碼或編碼了兩次顏色泊藕。
上面的兩個(gè)等式中的下面一個(gè)是一個(gè)很簡單的乘積辅辩,出于數(shù)字硬件需要來讓轉(zhuǎn)換可以完美的逆轉(zhuǎn)。上方的表達(dá)式娃圆,包含對(duì)一個(gè)值進(jìn)行冪計(jì)算玫锋,對(duì)所有[0.0,1.0]內(nèi)的輸入值x使用棚唆。將偏移和縮放考慮在內(nèi)食棕,這種函數(shù)可以近似表示為下面的簡潔形式:
其中亭敢。
正因?yàn)橛?jì)算得知必須為顯示進(jìn)行編碼它匕,圖像必須在進(jìn)行計(jì)算前轉(zhuǎn)換為線性空間中的值挺益。任何我們?cè)陲@示器或電視上看到的顏色是一些顯示編碼獲得的RGB元組辛藻,我們可以從屏幕捕捉或顏色采集器哪里獲得顏色腰懂。這些值存儲(chǔ)在一些文件格式中刁俭,例如PNG窜管,JEPG和GIF散劫,它們不需要進(jìn)行額外的轉(zhuǎn)換就可以送往幀緩沖中并顯示在屏幕上。換句話說幕帆,我們?cè)谄聊簧峡吹降亩际墙?jīng)過顯示編碼的數(shù)據(jù)获搏。在著色計(jì)算中使用這些顏色值前,我們必須將這種編碼形式轉(zhuǎn)換回線性值失乾。我們需要的從sRGB編碼值轉(zhuǎn)換到線性空間值得轉(zhuǎn)換公式是:
其中y代表一個(gè)標(biāo)準(zhǔn)化顯示通道值常熙,即存儲(chǔ)在一張圖片或幀緩沖中的值,被表示為范圍的值碱茁。這個(gè)解碼函數(shù)是我們之前sRGB函數(shù)的逆裸卫。這意味著如果一張紋理被一個(gè)著色器訪問,冰潔不經(jīng)改變輸出纽竣,它會(huì)和處理前保持一致墓贿。解碼函數(shù)和顯示轉(zhuǎn)移函數(shù)一致,因?yàn)榇鎯?chǔ)在紋理中的值已經(jīng)編碼過了蜓氨。與其進(jìn)行轉(zhuǎn)換來得到線性反應(yīng)顯示聋袋,我們進(jìn)行轉(zhuǎn)換來得到線性值。
更簡單的伽馬顯示轉(zhuǎn)移函數(shù)是5.31等式的逆:
有時(shí)我們會(huì)看見一對(duì)更簡單的轉(zhuǎn)換穴吹,尤其是在手機(jī)和瀏覽器的app上:
如果我們不關(guān)注伽馬幽勒,較小的線性值在屏幕上會(huì)顯得很暗。一個(gè)相關(guān)的錯(cuò)誤是如果不執(zhí)行伽馬矯正的話一些顏色的色相會(huì)偏移港令。假設(shè)啥容,我們想要從顯示像素發(fā)出一個(gè)正比于線性計(jì)算值的輻射率锈颗,這意味著我們必須將線性值進(jìn)行
冪運(yùn)算。一個(gè)0.1線性值會(huì)得到0.351咪惠,0.2線性值會(huì)得到0.481击吱,0.5會(huì)得到0.730。如果沒有編碼的話硝逢,使用這些值的話會(huì)發(fā)出必須要更少的輻射率姨拥。注意0.0和1.0通常不會(huì)被改變绅喉。在伽馬校正使用前渠鸽,暗表面顏色會(huì)因?yàn)槿藶榈臉?gòu)建而變得更深。
另一個(gè)忽視伽馬矯正的問題是對(duì)于線性輻射率值物理正確的著色計(jì)算在非線性值上進(jìn)行柴罐。一個(gè)例子見下圖:
忽略伽馬校正也會(huì)影響抗鋸齒邊的質(zhì)量徽缚。例如,假設(shè)三角形邊覆蓋四個(gè)屏幕網(wǎng)格單元革屠,見下圖:
三角形的標(biāo)準(zhǔn)輻射率為1(白色)凿试,背景為0(黑色)。從左到右似芝,單元被覆蓋那婉。所以,如果我們使用一個(gè)盒裝濾波器党瓮,我們想要將像素的標(biāo)準(zhǔn)線性輻射率表示為0.125,0.375,0.625,0.875详炬。正確的方法是在線性值上執(zhí)行抗鋸齒,對(duì)四個(gè)結(jié)果值應(yīng)用編碼函數(shù)寞奸。如果沒有執(zhí)行的話呛谜,每個(gè)像素表示的輻射率會(huì)很暗,結(jié)果見上圖右側(cè)枪萄。這種偽造感為條痕感隐岛,因?yàn)檫吙雌饋碛悬c(diǎn)像扭曲的線。下圖顯示了這種效果:
sRGB標(biāo)準(zhǔn)在1996年發(fā)明瓷翻,現(xiàn)已在大多數(shù)的顯示器上使用聚凹。然而,顯示技術(shù)已經(jīng)從那時(shí)起得到了發(fā)展齐帚《恃溃可以顯示更亮和更廣范圍的顏色的顯示器得到了發(fā)展。
相關(guān)書籍和資源
- Pharr等人更深入地討論了采樣模式和抗鋸齒童谒。
- Techner的課程筆記展示了不同采樣模式生成方法单旁。
- Drobot總結(jié)了之前的實(shí)時(shí)領(lǐng)域的抗鋸齒研究,解釋了不同技術(shù)的屬性和性能饥伊。
- 大部分形態(tài)學(xué)抗鋸齒方法可以在相關(guān)SIGGRAPH課程的筆記上得到象浑。
- Reshetov和Jimenez提供了一些游戲中使用的形態(tài)學(xué)和暫存抗鋸齒技術(shù)的回顧蔫饰。
- 對(duì)于透明度的研究可以看一下McGuire的展示和Wyman的工作。
- Blinn的文章愉豺,“What Is a Pixel?”篓吁,提供了圖形學(xué)不同領(lǐng)域的相關(guān)定義。
- Blinn的《Dirty Pixel and Notation, Notation, Notation》書籍包括了一些濾波和抗鋸齒技術(shù)的介紹性文章蚪拦,在alpha杖剪、合成和伽馬矯正方面的文章也有。
- Jimenez的展示給出了抗鋸齒使用的一些最先進(jìn)的技術(shù)驰贷。
- Grritz和d'Eon對(duì)于伽馬研究矯正有不錯(cuò)的盛嘿。
- Poynton的書給出了在不同的媒介上的伽馬校正立體圖,以及其它顏色相關(guān)的課題括袒。
- Selan的白皮書次兆,解釋了顯示編碼和它在電影制作中的使用,以及其它相關(guān)的信息锹锰。