本文將著重搜集圖形學(xué)基礎(chǔ)中的一些容易被忽視的細(xì)節(jié)古徒,從而避免因此導(dǎo)致的效果異常問題冷离。
渲染相關(guān)
- Alpha to coverage(A2C)[3,4,7]
由于MSAA只能處理幾何邊緣近速,因此在MSAA中使用Alpha-Test繪制的物體在Alpha漸變的邊緣的鋸齒就無(wú)法被平滑扭屁,這個(gè)問題有如下三種解決方案:
- 通過(guò)增加頂點(diǎn)的方式將alpha邊緣轉(zhuǎn)換為幾何邊緣,這種方案會(huì)導(dǎo)致幾何數(shù)據(jù)增加嘉冒,代價(jià)比較高
- 使用alpha-blend替換alpha-test曹货,這種方案需要對(duì)模型按照從后到前進(jìn)行排序,費(fèi)時(shí)費(fèi)力且效果可能還會(huì)有問題
- 通過(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:
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