圖形學(xué)基礎(chǔ)算法介紹

本文將著重搜集圖形學(xué)基礎(chǔ)中的一些容易被忽視的細(xì)節(jié)古徒,從而避免因此導(dǎo)致的效果異常問題冷离。

渲染相關(guān)

  • Alpha to coverage(A2C)[3,4,7]

由于MSAA只能處理幾何邊緣近速,因此在MSAA中使用Alpha-Test繪制的物體在Alpha漸變的邊緣的鋸齒就無(wú)法被平滑扭屁,這個(gè)問題有如下三種解決方案:

  1. 通過(guò)增加頂點(diǎn)的方式將alpha邊緣轉(zhuǎn)換為幾何邊緣,這種方案會(huì)導(dǎo)致幾何數(shù)據(jù)增加嘉冒,代價(jià)比較高
  2. 使用alpha-blend替換alpha-test曹货,這種方案需要對(duì)模型按照從后到前進(jìn)行排序,費(fèi)時(shí)費(fèi)力且效果可能還會(huì)有問題
  3. 通過(guò)硬件輔助實(shí)現(xiàn)的A2C進(jìn)行處理讳推,成本低顶籽,效果好。

在MSAA的實(shí)現(xiàn)中娜遵,硬件會(huì)為每個(gè)fragment下的每個(gè)sample各分配一個(gè)bit用作mask(比如4x MSAA的話蜕衡,每個(gè)fragment對(duì)應(yīng)的mask就是4bits的),這個(gè)mask可以稱之為coverage mask(這個(gè)mask是在Rasterization階段輸出的设拟,而在開啟了A2C功能后慨仿,在PS中會(huì)根據(jù)alpha值對(duì)此值進(jìn)行修正),在后續(xù)進(jìn)行blend的時(shí)候會(huì)用于判斷當(dāng)前sample是否需要更新的依據(jù)纳胧。

在開啟A2C的時(shí)候镰吆,硬件會(huì)將當(dāng)前shading pixel的alpha數(shù)值轉(zhuǎn)化為coverage,之后根據(jù)coverage對(duì)應(yīng)的mask(比如4x MSAA, coverage 87-100% 的mask為 1111, 62-87% 為 0111, 37-62% 為 0011, 12-37% 為 0001跑慕,0-12% 為 0000)對(duì)當(dāng)前像素中的sample進(jìn)行覆蓋寫入万皿。這里需要注意的是早期硬件的coverage mask是通過(guò)固定函數(shù)實(shí)現(xiàn)的摧找,但當(dāng)代顯卡卻是可以通過(guò)PS對(duì)coverage mask進(jìn)行手動(dòng)處理。

這里需要注意的是牢硅,A2C應(yīng)該只用于Alpha-Test物件蹬耘,Alpha-Blend以及不透明物件都不應(yīng)該使用减余,否則徒增消耗综苔。

使用A2C實(shí)現(xiàn)的MSAA其表現(xiàn)比FSAA效果更好,因?yàn)椴粫?huì)出現(xiàn)由于貼圖縮小導(dǎo)致的閃爍(不過(guò)貼圖放大器效果可能會(huì)更模糊位岔,這是alpha-blend方案的通踩缟浮)

  • Order-Independent Tranparency(OIT)

為了得到正確的渲染效果,半透物件渲染常見的做法是將物件按照從后往前的順序進(jìn)行排序抒抬,并按順序進(jìn)行渲染杨刨。

這種做法的缺陷在于排序比較費(fèi)時(shí),且對(duì)于存在深度穿插的物件而言擦剑,也不能完美解決問題妖胀。為了應(yīng)對(duì)這兩個(gè)問題,大家紛紛嘗試給出一種OIT渲染方案抓于,通過(guò)一種順序無(wú)關(guān)的權(quán)重計(jì)算方式來(lái)對(duì)半透物件進(jìn)行累加做粤。為了對(duì)權(quán)重進(jìn)行歸一化,通常需要將權(quán)重累加到一個(gè)單獨(dú)的buffer中(也就是需要MRT的支持)捉撮,之后通過(guò)一個(gè)單獨(dú)的pass對(duì)半透物件的渲染結(jié)果(即需要將半透物件渲染到一個(gè)單獨(dú)的buffer中)進(jìn)行resolve(其實(shí)就是權(quán)重歸一化)怕品。

OIT有多種實(shí)現(xiàn)方式,這里給出一種Weighted Blended Order-Independent Transparency方案作為示例巾遭,在這個(gè)方案中肉康,權(quán)重的計(jì)算與當(dāng)前待寫入像素的depth有關(guān)(距離相機(jī)越近,權(quán)重越大灼舍,這種做法是可以理解的)吼和,在PS計(jì)算的時(shí)候,根據(jù)像素的depth以及opacity計(jì)算對(duì)應(yīng)的權(quán)重weight骑素,之后將當(dāng)前待寫入的color數(shù)據(jù)累加到半透color buffer中(float4(color* opacity, opacity) * weight)炫乓,并將weight寫入對(duì)應(yīng)的半透權(quán)重buffer中。之后按照OIT的通用邏輯進(jìn)行resolve之后與不透明buffer結(jié)果相疊加得到最終結(jié)果献丑。

  • MSAA Sample Pattern

最近讀文章看到說(shuō)末捣,MSAA Sample Pattern基本已經(jīng)成為業(yè)界標(biāo)準(zhǔn),即不論何種機(jī)型创橄,相同倍率的Sample Pattern基本上都是一致的箩做,突然很好奇,在不同的倍率下的sample pattern到底是怎樣的妥畏,這個(gè)問題MJP的DangerZone已經(jīng)做了解答邦邦。

基本實(shí)現(xiàn)原理是通過(guò)繪制一個(gè)高密度的grid安吁,而gird中的頂點(diǎn)數(shù)據(jù)存放的是這個(gè)頂點(diǎn)的相對(duì)于grid的起始位置信息,在MSAA作用下燃辖,被grid的quad所覆蓋的sample會(huì)有數(shù)據(jù)寫入鬼店,之后將sample數(shù)據(jù)逐個(gè)輸出就能夠得到每個(gè)sample的位置信息了。原理非常簡(jiǎn)單黔龟,雖然結(jié)果不是百分百精確薪韩,但是大致夠用,如果希望得到更高精度的結(jié)果捌锭,還可以通過(guò)增加grid的尺寸做到,這里就直接借用其工具輸出各個(gè)倍率下的Sample Pattern:

1x
2x
4x
8x

D3D 10.1以后罗捎,API規(guī)定了各硬件必須遵循的MSAA sample pattern观谦,其結(jié)果與上面給出的結(jié)果中接近一致:

貼圖相關(guān)

  • 貼圖采樣點(diǎn)位置

貼圖采樣中,將UV坐標(biāo)轉(zhuǎn)換到貼圖空間(即從[0, 1]浮點(diǎn)數(shù)轉(zhuǎn)換成[0, TexWidth/TexHeight]的整數(shù))之后桨菜,整數(shù)UV(或者說(shuō)ST)對(duì)應(yīng)的實(shí)際是每個(gè)texel的中心豁状,以D3D為例,[0, 0]對(duì)應(yīng)的實(shí)際上是貼圖中左上角的texel的中心位置倒得,而非貼圖左上角的原點(diǎn)泻红。如果在實(shí)踐過(guò)程中發(fā)現(xiàn)貼圖采樣的結(jié)果距離自己的預(yù)期存在輕微的偏移,那么就是這個(gè)原因?qū)е铝讼疾簦唧w修正方法為將ST坐標(biāo)減去0.5谊路。[1]

  • Mipmap相關(guān)[1][2]

    • mip級(jí)別選取的原理:物體距離相機(jī)越近,mipmap級(jí)別越低(貼圖精度越高)菩彬,相鄰像素之間的UV差距應(yīng)該越小缠劝,因此可以根據(jù)相鄰像素對(duì)應(yīng)的UV差距來(lái)判定當(dāng)前像素所對(duì)應(yīng)的mipmap級(jí)別,這個(gè)操作通常是通過(guò)dx/dy來(lái)實(shí)現(xiàn)的(這一步通常是硬件自動(dòng)完成)骗灶。
    • 使用mipmap雖然會(huì)導(dǎo)致所使用的貼圖大小有大約1/3尺寸的增幅惨恭,但是其優(yōu)點(diǎn)完全可以覆蓋因此導(dǎo)致的損失:不但有助于減輕采樣高精度貼圖導(dǎo)致的高頻顏色跳變(這其實(shí)是采樣頻率不足導(dǎo)致的重建失敗而出現(xiàn)的鋸齒感),同時(shí)還有助于減輕貼圖采樣所需要的帶寬(貼圖訪問會(huì)有一個(gè)cache機(jī)制耙旦,在訪問某個(gè)像素時(shí)脱羡,會(huì)同步將周邊的像素一并加載到顯存。采用合適的mipmap免都,有助于提升cache的效率锉罐,避免頻繁的cache miss,從而降低帶寬需要)琴昆。
    • 不是所有的貼圖都應(yīng)該使用mipmap:
      • 不需要進(jìn)行filtering的貼圖(比如索引氓鄙、深度等非image信息)不應(yīng)該使用mipmap
      • 不會(huì)因?yàn)橄鄼C(jī)遠(yuǎn)近而縮放的貼圖(比如UI所使用的的貼圖等)不應(yīng)該使用mipmap
  • 貼圖過(guò)濾
    目前常用的貼圖過(guò)濾(filtering)方法有以下幾種,按照順序业舍,效果與性能消耗逐漸提升:

    • point filtering抖拦,點(diǎn)采樣升酣,無(wú)任何過(guò)濾,相當(dāng)于直接采取貼圖上最近的texel作為輸出結(jié)果(一次貼圖采樣)
    • bilinear filtering,雙線性采樣,會(huì)根據(jù)uv坐標(biāo)的小數(shù)部分對(duì)相鄰的四個(gè)texel進(jìn)行采樣并加權(quán)平均(通常由硬件自動(dòng)完成)固蚤,效果相對(duì)點(diǎn)采樣有極大提升链方,鋸齒感得到較好的抑制,但是圖像也會(huì)相對(duì)模糊镶摘。(四次貼圖采樣)
    • trilinear filtering,三線性采樣,對(duì)計(jì)算得到的mipmap層級(jí)保留其小數(shù)部分凿菩,據(jù)此增加一層mipmap級(jí)別的過(guò)濾處理,即同時(shí)對(duì)相鄰兩層mipmap應(yīng)用bilinear filtering帜讲,之后根據(jù)mipmap小數(shù)部分對(duì)結(jié)果進(jìn)行加權(quán)平均(八次貼圖采樣)
    • anisotropic filtering衅谷,各向異性采樣,直接按照x/y方向上的最大梯度來(lái)計(jì)算mipmap級(jí)別會(huì)導(dǎo)致一個(gè)狹長(zhǎng)的物體在屏幕上的效果較為模糊似将,為了能同時(shí)兼顧兩個(gè)方向上的梯度變化获黔,通常需要通過(guò)各向異性采樣來(lái)解決。各向異性采樣算法稍微復(fù)雜一點(diǎn)在验,需要將屏幕空間的像素按照短軸(而非普通mipmap算法中按照長(zhǎng)軸)計(jì)算的mipmap層級(jí)投影到貼圖空間玷氏,之后得到多個(gè)對(duì)應(yīng)的texel sample,在每個(gè)sample上應(yīng)用trilinear filtering并加權(quán)平均得到最終的結(jié)果腋舌,具體可以參考使用最廣的FAST(Footprint Area Sampled Texturing)算法實(shí)現(xiàn)盏触。

參考文獻(xiàn)

1. 圖形學(xué)底層探秘 - 紋理采樣、環(huán)繞块饺、過(guò)濾與Mipmap的那些事
2. Do Use Mipmapping
3. MSAA and alpha-to-coverage
4. Alpha to coverage - Humus
5. Weighted Blended Order-Independent Transparency
6. 亂彈紀(jì)錄II:Alpha To Coverage
7. UE426終于實(shí)現(xiàn)了Alpha to Coverage

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耻陕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刨沦,更是在濱河造成了極大的恐慌诗宣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件想诅,死亡現(xiàn)場(chǎng)離奇詭異召庞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)来破,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門篮灼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人徘禁,你說(shuō)我怎么就攤上這事诅诱。” “怎么了送朱?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵娘荡,是天一觀的道長(zhǎng)干旁。 經(jīng)常有香客問我,道長(zhǎng)炮沐,這世上最難降的妖魔是什么争群? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮大年,結(jié)果婚禮上换薄,老公的妹妹穿的比我還像新娘。我一直安慰自己翔试,他們只是感情好轻要,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垦缅,像睡著了一般伦腐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上失都,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音幸冻,去河邊找鬼粹庞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洽损,可吹牛的內(nèi)容都是我干的庞溜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碑定,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼流码!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起延刘,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漫试,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碘赖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驾荣,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年普泡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了播掷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撼班,死狀恐怖歧匈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砰嘁,我是刑警寧澤件炉,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布勘究,位于F島的核電站,受9級(jí)特大地震影響妻率,放射性物質(zhì)發(fā)生泄漏乱顾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一宫静、第九天 我趴在偏房一處隱蔽的房頂上張望走净。 院中可真熱鬧,春花似錦孤里、人聲如沸伏伯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)说搅。三九已至,卻和暖如春虏等,著一層夾襖步出監(jiān)牢的瞬間弄唧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工霍衫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留候引,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓敦跌,卻偏偏與公主長(zhǎng)得像澄干,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柠傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355